-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGame.pde
139 lines (108 loc) · 2.96 KB
/
Game.pde
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
class Game implements KeyListener
{
ArrayList<Entity> entities;
ArrayList<Entity> pendingAdd = new ArrayList<Entity>();
ArrayList<Entity> pendingRemove = new ArrayList<Entity>();
ArrayList<Entity> friendlyShips = new ArrayList<Entity>();
ArrayList<Entity> friendlyProjectiles = new ArrayList<Entity>();
ArrayList<Entity> enemyShips = new ArrayList<Entity>();
ArrayList<Entity> enemyProjectiles = new ArrayList<Entity>();
boolean running = true;
public Game() {
entities = new ArrayList<Entity>();
keyListeners.add(this);
}
PVector temp = new PVector();
CollisionEvent collision = new CollisionEvent();
private Entity raiseCollision(Entity owner, Entity other) {
collision.entity = other;
collision.destroy = true;
owner.onCollision(collision);
if (collision.destroy) {
return owner;
}
return null;
}
public void processCollisions() {
Entity s = null;
Entity p = null;
friendly:
for (Entity ship : friendlyShips) {
for (Entity projectile : enemyProjectiles) {
float r = ship.radius + projectile.radius;
temp.set(ship.position);
temp.sub(projectile.position);
if (temp.magSq() < (r * r)) {
// they collide
s = raiseCollision(ship, projectile);
p = raiseCollision(projectile, ship);
break friendly;
}
}
}
if (s != null) {
pendingRemove.add(s);
friendlyShips.remove(s);
}
if (p != null) {
pendingRemove.add(p);
enemyProjectiles.remove(p);
}
s = null;
p = null;
enemy:
for (Entity ship : enemyShips) {
for (Entity projectile : friendlyProjectiles) {
float r = ship.radius + projectile.radius;
temp.set(ship.position);
temp.sub(projectile.position);
if (temp.magSq() < (r * r)) {
// they collide
s = raiseCollision(ship, projectile);
p = raiseCollision(projectile, ship);
break enemy;
}
}
}
if (s != null) {
pendingRemove.add(s);
enemyShips.remove(s);
}
if (p != null) {
pendingRemove.add(p);
friendlyProjectiles.remove(p);
}
}
public void update() {
if (!running)
return;
processCollisions();
for (Entity entity : entities) {
entity.update(1/frameRate);
}
for (Entity entity : pendingAdd) {
entities.add(entity);
}
pendingAdd.clear();
for (Entity entity : pendingRemove) {
entities.remove(entity);
}
pendingRemove.clear();
stage.update(1/frameRate);
}
public void draw() {
background(20);
stage.draw();
for (Entity entity : entities) {
entity.draw();
}
player.drawUi();
}
public void keyPressed(int keyCode) {
if (key == 'p') {
running = !running;
}
}
public void keyReleased(int keyCode) {
}
}