forked from github/game-off-2012
/
AmmoHost.as
148 lines (125 loc) · 4.73 KB
/
AmmoHost.as
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
140
141
142
143
144
145
146
147
148
package {
import net.flashpunk.Entity;
import net.flashpunk.FP;
import net.flashpunk.graphics.Emitter;
import net.flashpunk.graphics.Graphiclist;
import net.flashpunk.graphics.Image;
import net.flashpunk.masks.Pixelmask;
import net.flashpunk.tweens.misc.ColorTween;
import net.flashpunk.utils.Ease;
/**
* A host entity that drops ammo on rupture.
*/
public class AmmoHost extends Entity {
private static const LAYER:int = 50;
private static const RUPTURE_TIME:Number = 1.5; // seconds to rupture
private static const SPEED:uint = 80; // pixels per second
[Embed(source='assets/ammo_host_96x128.png')]
private const HOST:Class;
[Embed(source='assets/bullet_17x17.png')]
private const BULLET:Class;
private var hostImage:Image;
private var explosionEmitter:Emitter;
private var collisionTime:Number = -1;
private var collisionTween:ColorTween = new ColorTween();
public function AmmoHost() {
hostImage = new Image(HOST);
hostImage.color = 0xffffff;
hostImage.alpha = 0.9;
mask = new Pixelmask(hostImage.buffer);
var bulletImage:Image = new Image(BULLET);
explosionEmitter = new Emitter(bulletImage.buffer, 17, 17);
explosionEmitter.newType("explosion", [0]);
explosionEmitter.relative = false;
explosionEmitter.setAlpha("explosion", 1, 0);
explosionEmitter.setMotion("explosion", 0, 40, 0.4, 360, -30, -0.05, Ease.quadOut);
graphic = new Graphiclist(hostImage, explosionEmitter);
layer = LAYER;
type = "host";
}
/**
* Prep for display as a new instance (used after
* getting a potentially recycled instance).
*/
public function reset():void {
collisionTween.tween(RUPTURE_TIME, 0xffffff, 0x666666);
collisionTime = -1;
collidable = true;
hostImage.visible = true;
hostImage.color = 0xffffff;
}
override public function update():void {
if (collidable) {
moveBy(0, SPEED * FP.elapsed);
if (collide("player", x, y)) {
if (collisionTime < 0) {
collisionTime = 0;
addTween(collisionTween);
}
collisionTime += FP.elapsed;
hostImage.color = collisionTween.color;
if (collisionTime > RUPTURE_TIME) {
collisionTween.cancel();
spillClones();
(FP.world as MyWorld).rupturedAmmoHosts++;
destroy();
}
} else {
if (collisionTime >= 0) {
collisionTween.cancel();
collisionTween.tween(RUPTURE_TIME, 0xffffff, 0x666666);
hostImage.color = 0xffffff;
}
collisionTime = -1;
}
} else {
if (explosionEmitter.particleCount == 0) {
FP.world.recycle(this);
}
}
if (y > FP.screen.height) {
FP.world.recycle(this);
(FP.world as MyWorld).missedAmmoHosts++;
}
}
private function spillClones():void {
var p:Powerup = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x + 20;
p.y = y;
FP.world.add(p);
p = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x - 5;
p.y = y + height / 2;
FP.world.add(p);
p = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x + 20;
p.y = y + height;
FP.world.add(p);
p = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x + width - 20;
p.y = y + height;
FP.world.add(p);
p = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x + width + 5;
p.y = y + height / 2;
FP.world.add(p);
p = FP.world.create(Powerup, false) as Powerup;
p.reset();
p.x = x + width - 20;
p.y = y;
FP.world.add(p);
}
public function destroy():void {
collidable = false;
for (var i:uint = 0; i < 10; i++) {
explosionEmitter.emit("explosion", centerX, centerY);
}
hostImage.visible = false;
}
}
}