/// <summary>
        /// Update the player. Takes input from the keyboard and updates the position of the player.
        /// </summary>
        /// <param name="gameTime">Game time</param>
        public void Update(GameTime gameTime)
        {
            Rectangle visibleArea = VirtualScreenSize.CalculateVisibleArea(_playerModel.Position);
            var       deltaTime   = gameTime.ElapsedGameTime.Milliseconds / 1000f;
            var       state       = Keyboard.GetState();
            var       pressedKeys = state.GetPressedKeys();

            if (_animation != null && !_animation.Done)
            {
                if (pressedKeys.Length == 0)
                {
                    _animation = null;
                    return;
                }
                _animation.Update(deltaTime);
                _playerModel.Position = _animation.Position + new Vector2(deltaTime, 0);
                _playerModel.Frame    = _animation.CurrentFrame;
                return;
            }

            if (_animation != null && _animation.Done)
            {
                _playerModel.Position = _animation.Position;
                _playerModel.Frame    = _animation.CurrentFrame;
                MoveFinished?.Invoke(this, EventArgs.Empty);
            }

            if (!Disabled)
            {
                _animation = null;
                if (pressedKeys.Contains(Keys.W))
                {
                    _animation = new PlayerAnimationController(new int[] { 8, 9, 10, 11, 12, 13, 14, 15 },
                                                               _playerModel.Position,
                                                               new Vector2(0, -_playerModel.Speed),
                                                               MoveCooldownPeriod);
                }
                else if (pressedKeys.Contains(Keys.A))
                {
                    _animation = new PlayerAnimationController(new int[] { 16, 17, 18, 19, 20, 21, 22, 23 },
                                                               _playerModel.Position,
                                                               new Vector2(-_playerModel.Speed, 0),
                                                               MoveCooldownPeriod);
                }
                else if (pressedKeys.Contains(Keys.S))
                {
                    _animation = new PlayerAnimationController(new int[] { 0, 1, 2, 3, 4, 5, 6, 7 },
                                                               _playerModel.Position,
                                                               new Vector2(0, _playerModel.Speed),
                                                               MoveCooldownPeriod);
                }
                else if (pressedKeys.Contains(Keys.D))
                {
                    _animation = new PlayerAnimationController(new int[] { 24, 25, 26, 27, 28, 29, 30, 31 },
                                                               _playerModel.Position,
                                                               new Vector2(_playerModel.Speed, 0),
                                                               MoveCooldownPeriod);
                }
            }
        }
        public void Update(GameTime gameTime)
        {
            var deltaTime = (float)gameTime.ElapsedGameTime.TotalMilliseconds;

            if (_harvesterCooldown > 0f)
            {
                _harvesterCooldown -= deltaTime;
                return;
            }

            _harvesterCooldown = 0f;
            var mouseState    = Mouse.GetState();
            var mousePoint    = mouseState.Position;
            var mousePosition = VirtualScreenSize.ScreenToWorld(_playerModel.Position, mousePoint.X, mousePoint.Y);
            var distance      = Vector2.Distance(mousePosition, _playerModel.Position);

            if (mouseState.LeftButton == ButtonState.Pressed && distance <= _playerModel.ResourceHarvester.Range)
            {
                for (var x = 0; x < _terrainTileListModel.Resources.GetLength(0); x++)
                {
                    for (var y = 0; y < _terrainTileListModel.Resources.GetLength(1); y++)
                    {
                        var resource = _terrainTileListModel.Resources[x, y];
                        if (resource.Area.Contains(mousePosition) && resource.Amount > 0)
                        {
                            _harvesterCooldown = _playerModel.ResourceHarvester.Cooldown;
                            var amount = resource.Amount < _playerModel.ResourceHarvester.Speed ? resource.Amount : _playerModel.ResourceHarvester.Speed;
                            resource.Amount -= amount;
                            _playerResourcesModel.AddResource(resource.Type, amount);
                            break;
                        }
                    }
                }
            }

            if (_rightClickCooldown > 0f)
            {
                _rightClickCooldown -= deltaTime;
                return;
            }

            if (mouseState.RightButton == ButtonState.Pressed)
            {
                for (var x = 0; x < _terrainTileListModel.Resources.GetLength(0); x++)
                {
                    for (var y = 0; y < _terrainTileListModel.Resources.GetLength(1); y++)
                    {
                        var resource = _terrainTileListModel.Resources[x, y];
                        if (resource.Area.Contains(mousePosition) && resource.Amount > 0)
                        {
                            _rightClickCooldown    = _rightClickCooldownPeriod;
                            resource.AmountVisible = !resource.AmountVisible;
                            break;
                        }
                    }
                }
            }
        }
Exemple #3
0
        public override void Draw()
        {
            var visibleArea = VirtualScreenSize.CalculateVisibleArea(_playerModel.Position);
            var position    = new Vector2(visibleArea.X, visibleArea.Y + 20);

            int i = 0;

            while (i <= visibleArea.Width)
            {
                _bar.Draw(new Vector2(position.X + i, visibleArea.Y + 5), 0, Color.White, new Vector2(0.25f, 0.25f));
                i += 64;
            }

            // Water
            _water.Draw(position + new Vector2(15, 0), 0, Color.White, new Vector2(0.125f, 0.125f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Water.ToString(), position + new Vector2(55, 0), _playerResourcesModel.Water >= 0 ? Color.White : Color.Red);

            // Food
            _food.Draw(position + new Vector2(160, 0), 0, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Food.ToString(), position + new Vector2(200, 0), _playerResourcesModel.Food >= 0 ? Color.White : Color.Red);

            // Sand
            _terrain.Draw(position + new Vector2(320, 0), 0, Color.White, new Vector2(0.125f, 0.125f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Sand.ToString(), position + new Vector2(360, 0), _playerResourcesModel.Sand >= 0 ? Color.White : Color.Red);

            // Rock
            _terrain.Draw(position + new Vector2(480, 0), 2, Color.White, new Vector2(0.125f, 0.125f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Rock.ToString(), position + new Vector2(520, 0), _playerResourcesModel.Rock >= 0 ? Color.White : Color.Red);

            // Wood
            _tree.Draw(position + new Vector2(640, 0), 7, Color.White, new Vector2(0.25f, 0.25f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Wood.ToString(), position + new Vector2(680, 0), _playerResourcesModel.Wood >= 0 ? Color.White : Color.Red);

            // Coal
            _minerals.Draw(position + new Vector2(800, 0), 0, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Coal.ToString(), position + new Vector2(840, 0), _playerResourcesModel.Coal >= 0 ? Color.White : Color.Red);

            // Copper
            _minerals.Draw(position + new Vector2(960, 0), 1, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Copper.ToString(), position + new Vector2(1000, 0), _playerResourcesModel.Copper >= 0 ? Color.White : Color.Red);

            // Silver
            _minerals.Draw(position + new Vector2(1120, 0), 6, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Silver.ToString(), position + new Vector2(1160, 0), _playerResourcesModel.Silver >= 0 ? Color.White : Color.Red);

            // Gold
            _minerals.Draw(position + new Vector2(1280, 0), 3, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Gold.ToString(), position + new Vector2(1320, 0), _playerResourcesModel.Gold >= 0 ? Color.White : Color.Red);

            // Diamond
            _minerals.Draw(position + new Vector2(1440, 0), 2, Color.White, new Vector2(0.5f, 0.5f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Diamond.ToString(), position + new Vector2(1480, 0), _playerResourcesModel.Diamond >= 0 ? Color.White : Color.Red);

            // Population
            _population.Draw(position + new Vector2(1600, 0), 5, Color.White, new Vector2(0.5f, 0.7f));
            _spriteBatch.DrawString(_gameFont, _playerResourcesModel.Population.ToString() + "/" + _playerResourcesModel.PopulationLimit.ToString(), position + new Vector2(1640, 0), Color.White);
        }
        public override void Draw()
        {
            var visibleArea = VirtualScreenSize.CalculateVisibleArea(_playerModel.Position);

            visibleArea.Width  += 20;
            visibleArea.Height += 20;

            // Draw map and resources
            for (var x = 0; x < _tileList.Tiles.GetLength(0); x++)
            {
                for (var y = 0; y < _tileList.Tiles.GetLength(1); y++)
                {
                    var tile = _tileList.Tiles[x, y];
                    if (tile.Area.Intersects(visibleArea))
                    {
                        if (tile.Type == BiomeType.Water)
                        {
                            _water.Draw(tile.Position, tile.Frame, Color.White, tile.Scale);
                        }
                        else
                        {
                            _terrain.Draw(tile.Position, tile.Frame, Color.White, tile.Scale);
                        }

                        var resource = _tileList.Resources[x, y];
                        if (resource.Amount <= 0)
                        {
                            continue;
                        }

                        if (resource.Type == ResourceType.Rock || resource.Type == ResourceType.Sand || resource.Type == ResourceType.Water)
                        {
                            if (resource.AmountVisible)
                            {
                                DrawResourceAmount(resource);
                            }
                            continue;
                        }

                        if (resource.Type == ResourceType.Wood)
                        {
                            _tree.Draw(resource.Position, resource.Frame, Color.White);
                        }
                        else
                        {
                            _minerals.Draw(resource.Position, resource.Frame, resource.Amount > 0 ? Color.White : Color.Red);
                        }

                        if (resource.AmountVisible)
                        {
                            DrawResourceAmount(resource);
                        }
                    }
                }
            }
        }
        private void AvailableBuildings(GameTime gameTime)
        {
            var deltaTime     = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
            var mouseState    = Mouse.GetState();
            var mousePoint    = mouseState.Position;
            var mousePosition = VirtualScreenSize.ScreenToWorld(_playerModel.Position, mousePoint.X, mousePoint.Y);

            foreach (var building in _buildingListModel.AvailableBuildings)
            {
                if (building.Area.Contains(mousePosition))
                {
                    building.ShowTooltip = true;
                }
                else
                {
                    building.ShowTooltip = false;
                }

                if (_clickCooldown > 0f)
                {
                    _clickCooldown -= deltaTime;
                    return;
                }

                var pos = new Vector2((int)mousePosition.X, (int)mousePosition.Y);
                if (building.IsSelected)
                {
                    if (IntersectsAnotherBuilding(new Rectangle((int)pos.X - 10, (int)pos.Y - 10, building.Width - 30, building.Height - 30)))
                    {
                        building.CanBuild = false;
                    }
                    else
                    {
                        building.CanBuild = true;
                    }

                    if (mouseState.LeftButton == ButtonState.Pressed && building.CanBuild)
                    {
                        building.CanBuild = true;
                        BuildABuilding(building, pos);
                    }
                }

                if (building.Area.Contains(mousePosition) && mouseState.LeftButton == ButtonState.Pressed)
                {
                    _clickCooldown = _clickCooldownPeriod;
                    if (_playerResourceModel.HasEnoughResources(building.Cost))
                    {
                        building.IsSelected = !building.IsSelected;
                    }
                }
            }
        }
        public override void Draw()
        {
            var visibleArea   = VirtualScreenSize.CalculateVisibleArea(_playerModel.Position);
            var mouseState    = Mouse.GetState();
            var mousePoint    = mouseState.Position;
            var mousePosition = VirtualScreenSize.ScreenToWorld(_playerModel.Position, mousePoint.X, mousePoint.Y);

            var position = new Vector2(visibleArea.X, visibleArea.Bottom);

            int i = 0;

            while (i <= visibleArea.Width)
            {
                _bar.Draw(new Vector2(position.X + i, visibleArea.Bottom - 47), 0, Color.White, new Vector2(0.25f, 0.25f));
                i += 64;
            }

            var j = 15;

            foreach (var building in _buildingListModel.AvailableBuildings)
            {
                building.Position = new Vector2(position.X + j, visibleArea.Bottom - 47);
                building.Area     = new Rectangle((int)building.Position.X, (int)building.Position.Y, 64, 64);
                _buildings.Draw(building.Position, building.Frame, _playerResourcesModel.HasEnoughResources(building.Cost) ? Color.White : Color.Red, new Vector2(0.5f, 0.5f));
                j += 68;

                if (building.ShowTooltip)
                {
                    ShowTooltip(building);
                }

                if (building.IsSelected)
                {
                    _buildings.Draw(mousePosition, building.Frame, building.CanBuild ? Color.White : Color.Red);
                }
            }

            foreach (var b in _buildingListModel.BuiltBuildings)
            {
                _buildings.Draw(b.Position, b.Frame, Color.White);
            }
        }