From 60e8e48047e774a711fee35dfc58a7be993c3d88 Mon Sep 17 00:00:00 2001 From: aldrikboy Date: Tue, 12 Dec 2017 18:27:50 +0100 Subject: yos --- Penguloon/Enemies/EnemyBase.cs | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Penguloon/Enemies/EnemyBase.cs (limited to 'Penguloon/Enemies/EnemyBase.cs') diff --git a/Penguloon/Enemies/EnemyBase.cs b/Penguloon/Enemies/EnemyBase.cs new file mode 100644 index 0000000..2179e58 --- /dev/null +++ b/Penguloon/Enemies/EnemyBase.cs @@ -0,0 +1,88 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Penguloon.Levels; + +namespace Penguloon.Enemies +{ + public abstract class EnemyBase + { + public float Speed { get; set; } + + public int Health { get; set; } + + public Vector2 Position { get; set; } + public Vector2 TargetPosition { get; set; } + + public Texture2D Texture { get; set; } + + public Map Map { get; set; } + + public bool MovingTowardsFinish { get; set; } = false; + + public Type ChildObject { get; set; } + + public EnemyBase(Map map) + { + this.Map = map; + + this.Position = Map.SpawnPoint; + this.TargetPosition = Map.SpawnPointTargetPos; + } + + public void Update(float deltaTime) + { + int tileX = (int)(TargetPosition.X + 2) / Map.TileWidth; + int tileY = (int)(TargetPosition.Y + 2) / Map.TileHeight; + + if (Vector2.Distance(Position, TargetPosition) <= 3) + { + if(MovingTowardsFinish) + { + ReachEnd(); + return; + } + + Tile currentTile = Map.TileMap[tileY, tileX]; + + switch (currentTile.Direction) + { + case Direction.Up: TargetPosition = new Vector2(tileX * Map.TileWidth, (tileY - 1) * Map.TileHeight); break; + case Direction.Down: TargetPosition = new Vector2(tileX * Map.TileWidth, (tileY + 1) * Map.TileHeight); break; + case Direction.Left: TargetPosition = new Vector2((tileX - 1) * Map.TileWidth, tileY * Map.TileHeight); break; + case Direction.Right: TargetPosition = new Vector2((tileX + 1) * Map.TileWidth, tileY * Map.TileHeight); break; + case Direction.Finish: TargetPosition = Map.FinishPoint; MovingTowardsFinish = true; break; + } + } + + Vector2 movement = TargetPosition - Position; + movement.Normalize(); + + this.Position += (movement * Speed) * deltaTime; + } + + private void ReachEnd() + { + Map.Enemies.Remove(this); + } + + public void GetHit() + { + Health--; + + if (Health <= 0) + Map.Enemies.Remove(this); + + SpawnChild(); + + // play pop sound + } + + private void SpawnChild() + { + if (this.ChildObject == null) return; + + Map.SpawnEnemy(ChildObject, Position, TargetPosition); + } + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2