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; }
public void SetEaten(PointsMultiplier points) { State = GhostState.Eaten; Frightened = false; ShowAsPoints = points; }
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); } }
/// <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)); }