public override void Render(BufferedGraphics g) { if (IsVisible) { // Render the sprite. Returns the render coordiates. PointF renderCoords = SpriteWithDirectionsRenderer.Render(g, _graphicsTracker, LocationCenter); if (IsAlive) { g.Graphics.DrawString($"{_health.Health:#.0}", _fontsAndColors.MonospaceFontSmaller, _fontsAndColors.BlueBrush, renderCoords.X, renderCoords.Y - 10); } else { g.Graphics.DrawString("Aaaaarrrghhh!", _fontsAndColors.MonospaceFontSmaller, _fontsAndColors.BlackBrush, renderCoords.X - 35, renderCoords.Y - 20); } } }
public TowerBase(TowerSettings settings, GameLevelTime gameLevelTime, GameLevel gameLevel, GraphicsTracker graphicsTracker, SpriteSheets spriteSheets, InputManager inputManager) { _shootLimiter = new GameLevelActionLimiter(gameLevelTime, settings.ShootFrequency); Settings = settings; _gameLevel = gameLevel; _graphicsTracker = graphicsTracker; _inputManager = inputManager; // TODO: Create sprite without direction. var spr = new SpriteWithDirections { Sprites = new Dictionary <SpriteDirectionEnum, SpriteDetails> { { SpriteDirectionEnum.BottomLeft, spriteSheets.GetSprite(SpriteEnum.Tower) }, { SpriteDirectionEnum.BottomRight, spriteSheets.GetSprite(SpriteEnum.Tower) }, { SpriteDirectionEnum.TopLeft, spriteSheets.GetSprite(SpriteEnum.Tower) }, { SpriteDirectionEnum.TopRight, spriteSheets.GetSprite(SpriteEnum.Tower) } } }; _sprite = new SpriteWithDirectionsRenderer(spr); }
public override void Update(TimeSpan timeDelta) { if (!IsVisible) { return; } if (!IsAlive) { AgonyPeriod -= timeDelta; if (AgonyPeriod.Ticks < 0) { IsVisible = false; _bus.Publish(new EnemyDespawned(this)); } return; } if (_currentWaypoint == 0) { Point mapLocation = ActualLocationByMap(_waypoints[_currentWaypoint].X, _waypoints[_currentWaypoint].Y); _currentX = mapLocation.X; _currentY = mapLocation.Y; _currentWaypoint = 1; } else { if (_waypoints.Count <= _currentWaypoint) { FoundPointG = true; _bus.Publish(new EnemyReachedGoal(this)); return; } Point currentWaypointMap = _waypoints[_currentWaypoint]; Point currentWaypoint = ActualLocationByMap(currentWaypointMap.X, currentWaypointMap.Y); // From current position to the current waypoint. Vector2 toWaypoint = new Vector2(currentWaypoint.X - _currentX, currentWaypoint.Y - _currentY); SpriteWithDirectionsRenderer.ChangeDirection(toWaypoint); // Distance traveled. float traveled = (float)timeDelta.TotalSeconds * speed; // From current position to the position where we should be (position delta) Vector2 traveledRelative = Vector2.Lerp(Vector2.Zero, toWaypoint, traveled / toWaypoint.Length()); _currentX += traveledRelative.X; _currentY += traveledRelative.Y; if (Math.Abs(toWaypoint.X) <= 1 && Math.Abs(toWaypoint.Y) <= 1) { _currentWaypoint++; } } LocationCenter = new PointF(_currentX - SpriteWithDirectionsRenderer.Sprite.Location.Width / 2, _currentY - SpriteWithDirectionsRenderer.Sprite.Location.Height / 2); }