forked from spaceyjase/godot-bulletml-prototype
-
Notifications
You must be signed in to change notification settings - Fork 1
/
MoveManager.cs
120 lines (101 loc) · 2.59 KB
/
MoveManager.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
120
using System.Collections.Generic;
using System.Diagnostics;
using BulletMLLib.SharedProject;
using Godot;
namespace bulletmltemplate
{
/// <summary>
/// MoveManager - represents a bullet manager, i.e. something generating bullets such as an enemy character.
/// </summary>
public partial class MoveManager : IBulletManager
{
private const float timeSpeed = 1.0f;
private const float scale = 1.0f;
private readonly List<Mover> movers = new List<Mover>();
private readonly List<Mover> topLevelMovers = new List<Mover>();
private readonly PositionDelegate GetPlayerPosition;
public MoveManager(PositionDelegate playerPosition)
{
Debug.Assert(playerPosition != null);
GetPlayerPosition = playerPosition;
}
public void Update(float delta)
{
for (var i = 0; i < movers.Count; i++)
{
movers[i].Update();
}
for (var i = 0; i < topLevelMovers.Count; i++)
{
topLevelMovers[i].Update();
}
FreeMovers();
}
private void FreeMovers()
{
for (var i = 0; i < movers.Count; i++)
{
if (movers[i].Used) continue;
movers.RemoveAt(i);
i--;
}
//clear out top level bullets
for (var i = 0; i < topLevelMovers.Count; i++)
{
if (!topLevelMovers[i].TasksFinished()) continue;
topLevelMovers.RemoveAt(i);
i--;
}
}
public Vector2 PlayerPosition(IBullet targettedBullet)
{
//just give the player's position
Debug.Assert(null != GetPlayerPosition);
return GetPlayerPosition();
}
public void RemoveBullet(IBullet deadBullet)
{
if (deadBullet is Mover myMover)
{
myMover.Used = false;
}
}
public IBullet CreateBullet()
{
var mover = new Mover(this) { TimeSpeed = timeSpeed, Scale = scale };
//initialize, store in our list, and return the bullet
mover.Init();
movers.Add(mover);
return mover;
}
public IBullet CreateTopBullet()
{
var mover = new Mover(this) { TimeSpeed = timeSpeed, Scale = scale };
//initialize, store in our list, and return the bullet
mover.Init();
topLevelMovers.Add(mover);
return mover;
}
public double Tier()
{
return 0.0;
}
public void Clear()
{
movers.Clear();
topLevelMovers.Clear();
}
public void PostUpdate()
{
// TODO: use godot game loop
foreach (var t in movers)
{
t.PostUpdate();
}
foreach (var t in topLevelMovers)
{
t.PostUpdate();
}
}
}
}