protected override void Initialize() { // TODO: Add your initialization logic here if (_playerWatches) { _graphics.PreferredBackBufferWidth = GraphicsDevice.DisplayMode.Width; _graphics.PreferredBackBufferHeight = GraphicsDevice.DisplayMode.Height; } else { _graphics.PreferredBackBufferWidth = 50; _graphics.PreferredBackBufferHeight = 50; } _graphics.ApplyChanges(); _trackTileGraphics = DrawTrack.Track(_trackTiles, GraphicsDevice.DisplayMode.Width / 2); _centerX = GraphicsDevice.DisplayMode.Width / 2; foreach (var cyclist in _cyclists) { cyclist.CyclistPositionX = _centerX; cyclist.StartTime = DateTime.Now; } _raceleader = _cyclists[_cyclists.Count - 1]; base.Initialize(); }
private void CheckSlipstream(CyclistRaceEngine cyclist) { if (_cyclists.Any(c => c.CyclistPositionX - cyclist.CyclistPositionX < 50 && c.CyclistPositionX - cyclist.CyclistPositionX > 0 && c.Id != cyclist.Id)) { cyclist.CyclistPositionX += 0.2f; } }
private void AddFinishedCyclists(CyclistRaceEngine cyclist) { if (!_finishedCyclists.Contains(cyclist)) { _finishedCyclists.Enqueue(cyclist); cyclist.FinishTime = DateTime.Now; if (_timeSpeed > 1) { cyclist.FinishTime = cyclist.FinishTime + (cyclist.TotalTime * (_timeSpeed - 1)); } } }
protected override void Update(GameTime gameTimeInput) { var gameTime = (float)gameTimeInput.ElapsedGameTime.TotalSeconds * _timeSpeed; if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) { Exit(); } if (_finishedCyclists.Count >= _cyclists.Count && !_playerWatches) { Exit(); } else if (_finishedCyclists.Count >= _cyclists.Count) { if (DateTime.Now.AddSeconds(5) > _finishedCyclists.Last().FinishTime) { Exit(); } } // TODO: Add your update logic here var kstate = Keyboard.GetState(); var lastTrack = _trackTileGraphics.Last(); foreach (var cyclist in _cyclists) { var positionCentertrack = _trackTileGraphics.Where(x => (x.X - _screenPosition) <= cyclist.CyclistPositionX).Max(x => x.X); var centreTrack = _trackTileGraphics.Where(x => x.X == positionCentertrack).FirstOrDefault(); var oldPosition = cyclist.CyclistPositionX; if (centreTrack.TrackTile == TrackTile.Horizontal || centreTrack.TrackTile == TrackTile.HorizontalCobblestones) { if (centreTrack.X + TextureParameters.Horizontal < cyclist.CyclistPositionX + _screenPosition) { AddFinishedCyclists(cyclist); continue; } cyclist.CyclistPositionY = centreTrack.Y; if (centreTrack.TrackTile == TrackTile.Horizontal) { cyclist.CyclistPositionX += cyclist.CyclistSpeedHorizontal * gameTime; } else { cyclist.CyclistPositionX += (cyclist.CyclistSpeedHorizontal + cyclist.CyclistSpeedCobblestone) / 2 * gameTime; } if (centreTrack.X == lastTrack.X) { continue; } CheckSlipstream(cyclist); } else if (centreTrack.TrackTile == TrackTile.Up) { if (centreTrack.X + TextureParameters.UpDown < cyclist.CyclistPositionX + _screenPosition) { AddFinishedCyclists(cyclist); continue; } var differenceX = cyclist.CyclistPositionX - (positionCentertrack - _screenPosition); cyclist.CyclistPositionY = (centreTrack.Y + TextureParameters.UpDown / 2) - differenceX / 2; cyclist.CyclistPositionX += cyclist.CyclistSpeedUp * gameTime; if (centreTrack.X == lastTrack.X) { continue; } CheckSlipstream(cyclist); } else if (centreTrack.TrackTile == TrackTile.Down) { if (centreTrack.X + TextureParameters.UpDown < cyclist.CyclistPositionX + _screenPosition) { AddFinishedCyclists(cyclist); continue; } var differenceX = cyclist.CyclistPositionX - (positionCentertrack - _screenPosition); cyclist.CyclistPositionY = centreTrack.Y + differenceX / 2; cyclist.CyclistPositionX += cyclist.CyclistSpeedDown * gameTime; if (centreTrack.X == lastTrack.X) { continue; } CheckSlipstream(cyclist); } if (cyclist.CyclistPositionX > _raceleader.CyclistPositionX) { _raceleader = cyclist; } } var _raceLeaderGain = _raceleader.CyclistPositionX - _centerX; _leaderDifferenceWithStandardY = GeneralParameters.CentralPositionY - _raceleader.CyclistPositionY; foreach (var cyclist in _cyclists) { cyclist.CyclistPositionX -= _raceLeaderGain; } _screenPosition += _raceLeaderGain; base.Update(gameTimeInput); }