protected override void Update(GameTime gameTime) { #region GUI if (_guiVisible) { GUI.Update(gameTime); } Cursor.Update(gameTime); #endregion GUI #region Cursor Actions MouseState mouse = Mouse.GetState(); switch (Cursor.CurrentState) { case CursorState.Build: if (mouse.LeftButton == ButtonState.Pressed || mouse.RightButton == ButtonState.Pressed) { var quad = GameParameters.CurrentMap.GetQuadrant(Cursor.Position); GameParameters.CurrentMap.ChangeQuadrant(quad, mouse.LeftButton == ButtonState.Pressed ? Tile.Wall : Tile.Ground); } break; case CursorState.AddEntity: if (mouse.LeftButton == ButtonState.Pressed) { Vector2 position = new Vector2(Cursor.Position.X, Cursor.Position.Y); if (_currentEntity != null && _currentTag != TypeTag.None && !GameParameters.CurrentMap.CollidesWithMap(Cursor.CollisionRect) && !_mousePressed) { AddEntity(_currentEntity, position, _currentTag); _mousePressed = true; } } else if (mouse.RightButton == ButtonState.Pressed) { _mousePressed = true; } else { _mousePressed = false; } break; default: break; } #endregion Cursor Actions #region Keyboard Shortcuts KeyboardState keys = Keyboard.GetState(); if (keys.IsKeyDown(Keys.Tab)) { if (!_tabPressed && _sandbox) { _guiVisible = !_guiVisible; Cursor.CurrentState = CursorState.Normal; _tabPressed = true; } } else { _tabPressed = false; } if (keys.IsKeyDown(Keys.Escape)) { Exit(Result.ReturnToTitle); } #endregion Keyboard Shortcuts #region Lifetime if (State == RunState.Initializing) { return; } if (CheckFinish(gameTime)) { _parameterUpdateCounter = 0.0f; return; } #endregion Lifetime #region Parameter Update _parameterUpdateCounter += gameTime.ElapsedGameTime.Milliseconds; if (_parameterUpdateCounter >= ParameterUpdateTime) { _parameterUpdateCounter -= ParameterUpdateTime; GameParameters.UpdateEntities(Entities); } #endregion Parameter Update #region Messages MessageManager.ProcessMessages((message) => { if (message.Receiver == -1) { foreach (var entity in Entities.OfType <BaseEntity>()) { if (entity.Id != message.Sender) { entity.ReceiveMessage(message); } } } else { var entity = Entities.OfType <BaseEntity>().FirstOrDefault(e => message.Receiver == e.Id); if (entity != null) { entity.ReceiveMessage(message); } } }); #endregion Messages #region Entity Update if (!_isPaused) { foreach (var entity in Entities) { TryUpdateEntity(gameTime, entity); } #region Entities Check var entities = Entities.OfType <BaseEntity>(); foreach (var entity in entities) { if (_toRemove.Contains(entity)) { continue; } var bbox = entity.BoundingBox; if (GameParameters.CurrentMap.CollidesWithMap(bbox)) { _toRemove.Push(entity); continue; } var intersect = entities.Where(e => e.BoundingBox.Intersects(bbox)); foreach (var intersection in intersect) { if (entity.TargetTag == intersection.Tag) { intersection.GetHit(); if (intersection.Health <= 0) { _toRemove.Push(intersection); } if (entity.Tag == TypeTag.Bullet) { _toRemove.Push(entity); } } } } CleanEntities(); #endregion Entities Check #region Endgame Check if (!_sandbox) { if (entities.Where(e => e.Tag == TypeTag.Player).Count() == 0) { Exit(Result.GameOver); } else if (entities.Where(e => e.Tag == TypeTag.Objective).Count() == 0) { Exit(Result.LoadNext); } } #endregion Endgame Check } #endregion Entity Update base.Update(gameTime); }