예제 #1
0
        // This method moves the Pacman and checks for collision with Ghosts, Bullets, Dots, Walls and updates the coresponding properties to inform
        // the view of the latest collision.
        public void MovePacman()
        {
            if (Maps[0].CollidedWithPac)
            {
                Maps[0].CollidedWithPac = false;
                if (!isCheating)
                {
                    PacDead = true;
                    ((Pacman)Pacman).Lives -= 1;
                    if (((Pacman)Pacman).Lives == 0)
                    {
                        PacDead   = true;
                        GameState = GameState.Lost;
                    }
                    else
                    {
                        GameState           = GameState.Pause;
                        Pacman.Position.col = Pacman.StartPosition.col;
                        Pacman.Position.row = Pacman.StartPosition.row;
                        Pacman.Direction    = Direction.Left;
                    }
                }
            }


            Tile tempTile = Maps[0].Collision(Pacman.Direction, Pacman);

            LastCollidedWith = tempTile;

            switch (tempTile.Type)
            {
            case TileType.Wall:

                Pacman.Animate();
                Pacman.Position.row = Math.Round(Pacman.Position.row);
                Pacman.Position.col = Math.Round(Pacman.Position.col);
                break;

            case TileType.Dot:
                ((Pacman)Pacman).Score += tempTile.Value;
                Maps[0].RemoveFromMap(tempTile);

                if (Maps[0].Dots.Count == 0)
                {
                    GameState = GameState.Won;
                    ((Pacman)Pacman).Score += 100;
                }
                else
                {
                    Pacman.Animate();
                    Pacman.Move();
                }
                break;

            case TileType.MakeVulnerable:
                ((Pacman)Pacman).Score += tempTile.Value;
                Maps[0].RemoveFromMap(tempTile);
                Maps[0].MakeGhostVulnerable();
                MakeGhostsNormalTask = Task.Run(() => MakeGhostNormal());

                if (Maps[0].Dots.Count == 0)
                {
                    GameState = GameState.Won;
                    ((Pacman)Pacman).Score += 100;
                }
                else
                {
                    Pacman.Animate();
                    Pacman.Move();
                }
                break;

            default:
                Pacman.Animate();
                Pacman.Move();
                break;
            }

            if ((Pacman.Position.row) % 1 < 0.2 && (Pacman.Position.col % 1) < 0.2)
            {
                Pacman.Direction = Pacman.PreviousDirection;
            }

            Tile GhostTile = Maps[0].CollisionWithGhost();

            if (GhostTile != null)
            {
                if (GhostTile.Vulnerable)
                {
                    AteGhost = true;
                    ((Pacman)Pacman).Score += GhostTile.Value;
                    GhostTile.Position.col  = GhostTile.StartPosition.col;
                    GhostTile.Position.row  = GhostTile.StartPosition.row;
                    GhostTile.Direction     = Direction.Up;
                }
                else
                {
                    if (!isCheating)
                    {
                        PacDead = true;
                        ((Pacman)Pacman).Lives -= 1;
                        if (((Pacman)Pacman).Lives == 0)
                        {
                            PacDead   = true;
                            GameState = GameState.Lost;
                        }
                        else
                        {
                            GameState           = GameState.Pause;
                            Pacman.Position.col = Pacman.StartPosition.col;
                            Pacman.Position.row = Pacman.StartPosition.row;
                            Pacman.Direction    = Direction.Left;
                        }
                    }
                }
            }
        }