コード例 #1
0
        public void Tick()
        {
            // gets called every 50 milliseconds
            // handle movement here, possibly

            if (Keys.Control == (Control.ModifierKeys & Keys.Control) && controls.IsDirectionKeyPressed)
            {
                controls.Sneak = true;
            }
            else
            {
                controls.Sneak = false;
            }

            if (Keys.Shift == (Control.ModifierKeys & Keys.Shift) && controls.IsDirectionKeyPressed)
            {
                controls.Run = true;
            }
            else
            {
                controls.Run = false;
            }


            ammopack.ReviveAmmo++;
            if (dude.IsAlive)
            {
                for (var i = bullets.Count - 1; i >= 0; i--)
                {
                    var b = bullets[i];
                    if (!b.IsDead)
                    {
                        b.Move();
                        foreach (var baddude in badGuys)
                        {
                            if (baddude.IsAlive)
                            {
                                if (b.GetRect(_zoom).IntersectsWith(baddude.GetRect(_zoom)))
                                {
                                    // kill the bullet
                                    b.IsDead = true;

                                    // enemy was hit. reduce his health
                                    baddude.health -= _rand.Next(10, 25);
                                    baddude.WasHit  = true;

                                    if (baddude.health <= 0)
                                    {
                                        // crap - he's dead
                                        baddude.IsAlive = false;
                                        alivebadguys--;
                                        Score++;
                                    }
                                }
                            }
                        }
                        for (var k = backgroundTiles.Count - 1; k >= 0; k--)
                        {
                            var tile = backgroundTiles[k];
                            if (tile is Wall || tile is Border || tile is Tree)
                            {
                                if (b.GetRect(_zoom).IntersectsWith(tile.GetRect(_zoom)))
                                {
                                    b.IsDead = true;
                                }
                            }
                        }
                        if (b.IsDead || b.Distance > 300)
                        {
                            b.IsDead = true;
                            bullets.Remove(b);
                        }
                    }
                }
            }
            if (controls.KillAllEnemies)
            {
                for (var i = badGuys.Count - 1; i >= 0; i--)
                {
                    var b = badGuys[i];
                    if (b.IsAlive)
                    {
                        b.IsAlive = false;
                        alivebadguys--;
                    }
                }
            }
            if (ammopack.IsAlive)
            {
                if (dude.IsAlive && ammopack.GetRect(_zoom).IntersectsWith(dude.GetRect(_zoom)))
                {
                    ammopack.IsAlive    = false;
                    dude.Ammo          += 50;
                    ammopack.ReviveAmmo = 0;
                }
            }
            else
            {
                if (ammopack.ReviveAmmo < 500)
                {
                    ammopack.ReviveAmmo++;
                }
                else
                {
                    ammopack.X       = 305;
                    ammopack.Y       = 340;
                    ammopack.IsAlive = true;
                }
            }


            for (var i = golds.Count - 1; i >= 0; i--)
            {
                if (golds[i].GetRect(_zoom).IntersectsWith(dude.GetRect(_zoom)))
                {
                    dude.Treasure += golds[i].Coins;
                    golds.RemoveAt(i);
                    Score += 5;
                }
            }

            for (var i = badGuys.Count - 1; i >= 0; i--)
            {
                var b = badGuys[i];
                if (b.IsAlive)
                {
                    if (b.GetRect(_zoom).IntersectsWith(dude.GetRect(_zoom)))
                    {
                        dude.IsAlive = false;
                    }

                    b.Move(_form.ClientSize.Width, _form.ClientSize.Height);
                }
            }

            var inWater = false;
            var inLava  = false;

            for (var j = badGuys.Count - 1; j >= 0; j--)
            {
                badGuys[j].IsInWater = false;
            }


            for (var i = backgroundTiles.Count - 1; i >= 0; i--)
            {
                var tile            = backgroundTiles[i];
                var isBadGuyBlocker = (tile is Wall || tile is Lava || tile is Border || tile is Tree || tile is DeepWater);

                if (tile is Water)
                {
                    var waterTile  = tile as Water;
                    var dudeGotWet = waterTile.GetRect(_zoom).IntersectsWith(dude.GetRect(_zoom));
                    if (dudeGotWet)
                    {
                        inWater = true;
                    }
                    for (var j = badGuys.Count - 1; j >= 0; j--)
                    {
                        var enemy    = badGuys[j];
                        var enemyWet = waterTile.GetRect(_zoom).IntersectsWith(enemy.GetRect(_zoom));
                        if (enemyWet)
                        {
                            enemy.IsInWater = true;
                        }
                    }
                }
                else if (tile is Lava)
                {
                    var lavaTile       = tile as Lava;
                    var dudeGotHotFeet = lavaTile.GetRect(_zoom).IntersectsWith(dude.GetRect(_zoom));
                    if (dudeGotHotFeet)
                    {
                        inLava = true;
                    }
                }

                if (isBadGuyBlocker)
                {
                    var blockerRect = tile.GetRect(_zoom);
                    for (var j = badGuys.Count - 1; j >= 0; j--)
                    {
                        var enemy            = badGuys[j];
                        var isInBlockingTile = blockerRect.IntersectsWith(enemy.GetRect(_zoom));
                        if (isInBlockingTile)
                        {
                            enemy.ReverseAndMoveOut(_zoom, _form.ClientSize.Width, _form.ClientSize.Height, blockerRect);
                        }
                    }
                }
            }
            dude.IsInWater = inWater;
            if (inLava)
            {
                dude.IsAlive = false;
            }

            dude.IsRunning  = controls.Run;
            dude.IsSneaking = controls.Sneak;


            if (controls.IsDirectionKeyPressed)
            {
                int treeCheckX = dude.X, treeCheckY = dude.Y;
                if (controls.Up)
                {
                    treeCheckY = dude.Y - dude.Speed;
                }
                if (controls.Down)
                {
                    treeCheckY = dude.Y + dude.Speed;
                }
                if (controls.Left)
                {
                    treeCheckX = dude.X - dude.Speed;
                }
                if (controls.Right)
                {
                    treeCheckX = dude.X + dude.Speed;
                }
                var hitSomething  = false;
                var treeCheckRect = new Rectangle(treeCheckX, treeCheckY,
                                                  Convert.ToInt32(dude.Size * _zoom), Convert.ToInt32(dude.Size * _zoom));

                for (var i = backgroundTiles.Count - 1; i >= 0; i--)
                {
                    var tile = backgroundTiles[i];
                    if (tile is Wall || tile is Tree || tile is Border || tile is DeepWater)
                    {
                        var wallkinwall = tile.GetRect(_zoom).IntersectsWith(treeCheckRect);
                        if (wallkinwall)
                        {
                            hitSomething = true;
                        }
                    }
                }
                if (!hitSomething)
                {
                    dude.X = treeCheckX;
                    dude.Y = treeCheckY;
                }
                dude.LastKnownDirection = controls.CurrentDirection;
            }

            if (controls.Death)
            {
                dude.IsAlive = false;
            }


            if (controls.Exit)
            {
                _form.Close();
                Application.Exit();
            }
            _form.Invalidate();
        }