Beispiel #1
0
        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();
        }
Beispiel #2
0
 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;
     }
 }
Beispiel #3
0
 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));
         }
     }
 }
Beispiel #4
0
        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);
        }