예제 #1
0
        public AttractMode(UiSystem uiSystem)
        {
            _uiSystem   = uiSystem;
            _display    = uiSystem.Display;
            _spriteSet  = uiSystem.SpriteSet;
            _scoreBoard = uiSystem.ScoreBoard;
            _display.Blank();
            _attractTick = 0;

            _pacMan = new PacMan(new Location(_display.Width + 1, 20), Direction.Left);
            _ghosts = new[]
            {
                new Ghost(GhostColour.Red, new Location(_display.Width + 5, 20), Direction.Left),
                new Ghost(GhostColour.Pink, new Location(_display.Width + 7, 20), Direction.Left),
                new Ghost(GhostColour.Cyan, new Location(_display.Width + 9, 20), Direction.Left),
                new Ghost(GhostColour.Orange, new Location(_display.Width + 11, 20), Direction.Left)
            };
            _showPowerPill = true;
            _pointsCounter = 0;
            _points        = 0;
        }
예제 #2
0
 public void SetEaten(PointsMultiplier points)
 {
     State        = GhostState.Eaten;
     Frightened   = false;
     ShowAsPoints = points;
 }
예제 #3
0
        private void MainLoop()
        {
            _ghostHouse.Tick();
            _ghostHouse.SetActiveGhost(Ghosts);

            _stateMachine.During(GameState.Playing, CheckAndSwitchChaseMode);

            _powerPillAnimation.Tick();

            if (_ghostEatenPause > 0)
            {
                _ghostEatenPause--;
                if (_ghostEatenPause == 0)
                {
                    foreach (var ghost in Ghosts.Where(g => g.State == GhostState.Eaten))
                    {
                        ghost.SetEyes();
                    }
                }

                MoveGhosts(true);
            }
            else
            {
                DoToGhosts(g => g.Animate());

                if (CheckPacManPill())
                {
                    _pacManPause = 1;
                    _ghostHouse.PillEaten();
                }

                _bonusFruit.Tick(_pillCount);

                MoveGhosts(false);

                if (CheckPacManPowerPill())
                {
                    _pacManPause = 3;
                    _ghostHouse.PillEaten();
                    DoToGhosts(g => g.SetFrightened(_speeds.FrightenedFlashTime));

                    _stateMachine.ChangeState(GameState.Frightened);
                }

                if (_pacManPause == 0)
                {
                    _pacManSpeed.SetSpeed(_stateMachine.IsCurrent(GameState.Frightened)
                        ? _speeds.PacManFrightenedSpeed
                        : _speeds.PacManSpeed);
                    _pacManSpeed.Tick();
                    MovePacMan(true);
                    if (_pacManSpeed.ExtraFrame)
                    {
                        MovePacMan(false);
                    }
                }
                else
                {
                    _pacManPause--;
                }


                if (_bonusFruit.ShowAsFruit)
                {
                    CheckPacManFruit();
                }

                _stateMachine
                .OnTrigger(GameState.Frightened,
                           () => _tick.NextEventAfter(_speeds.FrightenedTime),
                           () => { _ghostEatenPoints = 0; })
                .During(GameState.Frightened,
                        () => _tick.AtEvent(() => _stateMachine.ChangeState(GameState.Playing)))
                .OnExit(GameState.Frightened,
                        () =>
                {
                    foreach (var ghost in Ghosts.Where(g => g.Frightened))
                    {
                        ghost.SetNotFrightened();
                    }
                });

                foreach (var ghost in Ghosts)
                {
                    if (_pacMan.Location.IsNearTo(ghost.Location))
                    {
                        if (ghost.Frightened)
                        {
                            EatGhost(ghost);
                        }
                        else if (!_invincible && ghost.State == GhostState.Alive)
                        {
                            _stateMachine.ChangeState(GameState.Caught);
                        }
                    }
                }
            }

            if (_pillCount == _map.Pills)
            {
                _stateMachine.ChangeState(GameState.Complete);
            }
        }
예제 #4
0
 /// <summary>
 /// Points for eating ghosts 200, 400, 800, 1600
 /// </summary>
 /// <param name="multiplier">0-3</param>
 /// <returns></returns>
 public SpriteSource GhostPoints(PointsMultiplier multiplier)
 {
     return(new SpriteSource(16 + (int)multiplier * 2, 14, 2));
 }