-
Notifications
You must be signed in to change notification settings - Fork 0
/
EnemyManager.cs
119 lines (112 loc) · 4.29 KB
/
EnemyManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Monsterfall_01.Engine;
namespace Monsterfall_01
{
public class WaveArgs : EventArgs
{
public WaveArgs(List<Enemy> enemies)
{
this.enemies = enemies;
}
private readonly List<Enemy> enemies;
}
internal class EnemyManager
{
// List of enemies in the map
List<Enemy> enemyList;
// List of expected waves
List<Wave> waves;
// Index of current wave
int currentWave;
// Time remaining to next wave
float waveTimeLeft;
// Animations of the enemies
private Dictionary<string, List<Animation>> enemyAnimations;
int mapLimitX;
int mapLimitY;
// A random number generator
Random random;
public ref List<Enemy> GetEnemies() { return ref enemyList; }
public int GetWaveCount() { return waves.Count; }
public int GetCurrentWave() { return currentWave; }
public float GetTimeToNextWave() { return waveTimeLeft; }
public bool IsLastWave() { return waves.Count == (currentWave + 1); }
public event EventHandler<WaveArgs> OnLoadWave;
public event EventHandler<int> OnEnemyDied;
public event EventHandler<Vector2> OnEnemyHit;
public EnemyManager()
{
enemyAnimations = new Dictionary<string, List<Animation>>();
enemyList = new List<Enemy>();
waves = new List<Wave>();
currentWave = -1;
waveTimeLeft = 5;
random = new Random();
}
public void Initialize(List<Wave> waves, Vector2 mapSize)
{
this.waves = waves;
mapLimitX = (int)(mapSize.X - 1);
mapLimitY = (int)(mapSize.Y - 1);
}
public void AddAnimations(string name, List<Animation> animations)
{
enemyAnimations[name] = animations;
}
public void Remove(Enemy enemy)
{
enemyList.Remove(enemy);
}
// Load wave detail to the map (called after waveTimeLeft reaches zero)
private void LoadWave(int waveIndex)
{
waveTimeLeft = waves[waveIndex].timeToNextWave;
for (int i = 0; i < waves[waveIndex].enemyCount; i++)
{
Enemy enemy = new Enemy();
// TODO: MonsterIce will come from data in future
// When there are more types of enemies
// This will make the chance of enemies generate at the corners of the map higher
int enemyX = Math.Min(random.Next(1, 2 * mapLimitX), mapLimitX);
int enemyY = Math.Min(random.Next(1, 2 * mapLimitY), mapLimitY);
// the add new vector(i,i) is just to make the position different in case they had the same tile
enemy.Initialize(enemyAnimations["MonsterIce"], MapToScreen(enemyX, enemyY) + new Vector2(i,i));
enemy.EnemyDied += (object sender, int e) => { OnEnemyDied(this, e); };
enemy.EnemyHit += (object sender, Vector2 e) => { OnEnemyHit(this, e); };
enemyList.Add(enemy);
}
OnLoadWave(this, new WaveArgs(enemyList));
}
public void Update(GameTime gameTime)
{
waveTimeLeft -= (float)gameTime.ElapsedGameTime.TotalSeconds;
if (waveTimeLeft < 0 && currentWave < (waves.Count - 1))
{
currentWave++;
LoadWave(currentWave);
}
foreach(Enemy enemy in enemyList)
{
enemy.Update(gameTime);
}
}
public void Draw(SpriteBatch _spriteBatch,GraphicsDevice graphicsDevice)
{
foreach (Enemy enemy in enemyList)
{
enemy.Draw(_spriteBatch, graphicsDevice);
}
}
// TODO: this better be a helper class (Command class?)
private Vector2 MapToScreen(int x, int y)
{
// To map the tile toghether in ISOMETRIC way
var screenX = x * 256 / 2 - y * (256 / 2) + 0;
var screenY = y * (148 / 2 - 10) + x * (148 / 2 - 10) + 0;
return new Vector2(screenX, screenY);
}
}
}