Пример #1
0
        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);
        }