@@ -5,26 +5,28 @@ use ggez_goodies::{camera::{Camera, CameraDraw}, nalgebra_glm::Vec2, particle::{
5
5
use graphics:: { Font , Image , Mesh , TextFragment } ;
6
6
use rand:: Rng ;
7
7
8
- use crate :: { HEIGHT , Screen , WIDTH , components:: { bullet:: Turbofish , enemy:: Enemy , player:: Player , tile:: { Tile , TileType } } } ;
8
+ use crate :: { HEIGHT , Screen , WIDTH , components:: { barrel :: Barrel , bullet:: Turbofish , enemy:: Enemy , player:: Player , tile:: { Tile , TileType } } } ;
9
9
10
10
pub struct Game {
11
11
ground : Vec < Tile > ,
12
12
enemies : Vec < Enemy > ,
13
+ barrels : Vec < Barrel > ,
14
+
13
15
player_bullets : Vec < Turbofish > ,
14
16
player : Player ,
15
17
16
18
ground_resources : Vec < Image > ,
17
19
enemy_resources : Vec < Image > ,
18
20
player_resources : Vec < Image > ,
19
21
bullet_resources : Vec < Image > ,
20
-
21
- consolas : Font ,
22
-
23
22
ui_resources : Vec < Image > ,
24
23
audio_resources : Vec < Source > ,
24
+ barrel_resources : Vec < Image > ,
25
+
26
+ consolas : Font ,
25
27
26
28
camera : Camera ,
27
- elapsed_shake : Option < ( f32 , Vec2 ) > ,
29
+ elapsed_shake : Option < ( f32 , Vec2 , f32 ) > ,
28
30
tics : Option < i32 > ,
29
31
particles : Vec < ( ParticleSystem , f32 , f32 , i32 ) >
30
32
}
@@ -39,6 +41,8 @@ impl Game {
39
41
40
42
let mut ground = vec ! [ ] ;
41
43
let mut enemies = vec ! [ ] ;
44
+ let mut barrels = vec ! [ ] ;
45
+
42
46
let mut player = None ;
43
47
44
48
let mut draw_pos = 0. ;
@@ -80,6 +84,13 @@ impl Game {
80
84
ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
81
85
player = Some ( Player :: new ( draw_pos) ) ;
82
86
87
+ draw_pos += draw_inc;
88
+ } ,
89
+
90
+ '*' => {
91
+ ground. push ( Tile :: new ( draw_pos, TileType :: CENTER ) ) ;
92
+ barrels. push ( Barrel :: new ( draw_pos) ) ;
93
+
83
94
draw_pos += draw_inc;
84
95
}
85
96
@@ -95,6 +106,8 @@ impl Game {
95
106
ground,
96
107
enemies,
97
108
player,
109
+ barrels,
110
+
98
111
player_bullets : vec ! [ ] ,
99
112
100
113
ground_resources : vec ! [
@@ -117,7 +130,14 @@ impl Game {
117
130
Image :: new( ctx, "/images/Some(turbofish).png" ) . unwrap( ) ,
118
131
] ,
119
132
120
- ui_resources : vec ! [ Image :: new( ctx, "/images/Some(ammo).png" ) . unwrap( ) ] ,
133
+ ui_resources : vec ! [
134
+ Image :: new( ctx, "/images/Some(ammo).png" ) . unwrap( )
135
+ ] ,
136
+
137
+ barrel_resources : vec ! [
138
+ Image :: new( ctx, "/images/Some(barrel).png" ) . unwrap( )
139
+ ] ,
140
+
121
141
audio_resources : vec ! [
122
142
Source :: new( ctx, "/audio/Some(turbofish_shoot).mp3" ) . unwrap( ) ,
123
143
Source :: new( ctx, "/audio/Some(explode).mp3" ) . unwrap( )
@@ -157,6 +177,11 @@ impl Game {
157
177
enemy. draw ( ctx, & self . camera , & self . enemy_resources ) ?;
158
178
}
159
179
180
+ // Barrel
181
+ for boom in & mut self . barrels {
182
+ boom. draw ( ctx, & self . camera , & self . barrel_resources ) ?;
183
+ }
184
+
160
185
// Player
161
186
self . player
162
187
. draw ( ctx, & self . camera , & self . player_resources ) ?;
@@ -254,7 +279,9 @@ impl Game {
254
279
255
280
let mut done: bool = false ;
256
281
257
- for fish in & self . player_bullets {
282
+ for j in 0 ..self . player_bullets . len ( ) {
283
+ let fish = & self . player_bullets [ j] ;
284
+
258
285
if fish. pos_x >= go_start_x && fish. pos_x <= go_end_x {
259
286
const HEIGHT2 : f32 = HEIGHT / 2. ;
260
287
@@ -279,6 +306,53 @@ impl Game {
279
306
self . audio_resources [ 1 ] . play ( ) . expect ( "Cannot play Some(explode).mp3" ) ;
280
307
281
308
self . enemies . remove ( i) ;
309
+ self . player_bullets . remove ( j) ;
310
+
311
+ done = true ;
312
+ }
313
+ }
314
+
315
+ if done {
316
+ let cam_loc = self . camera . ___location ( ) ;
317
+ let org_pos = cam_loc. data . as_slice ( ) ;
318
+
319
+ self . elapsed_shake = Some ( ( 0. , Vec2 :: new ( org_pos[ 0 ] , org_pos[ 1 ] ) , 3. ) ) ;
320
+ self . camera_shakeke ( ) ;
321
+
322
+ break ;
323
+ }
324
+ }
325
+
326
+ for i in 0 ..self . barrels . len ( ) {
327
+ let barrel = & self . barrels [ i] ;
328
+
329
+ let barrel_start_x = barrel. pos_x ;
330
+ let barrel_end_x = barrel. pos_x + 91. ;
331
+
332
+ let mut done: bool = false ;
333
+
334
+ for fish in & self . player_bullets {
335
+ if fish. pos_x >= barrel_start_x && fish. pos_x <= barrel_end_x {
336
+ const HEIGHT2 : f32 = HEIGHT / 2. ;
337
+
338
+ self . particles . push (
339
+ ( ParticleSystemBuilder :: new ( ctx)
340
+ . count ( 500 )
341
+ . emission_rate ( 200.0 )
342
+ . start_max_age ( 5.0 )
343
+ . start_size_range ( 2.0 , 15.0 )
344
+ . delta_size ( Transition :: range ( 1. , 2. ) )
345
+ . delta_color ( Transition :: range (
346
+ ggez:: graphics:: Color :: from ( ( 255 , 0 , 0 ) ) ,
347
+ ggez:: graphics:: Color :: from ( ( 255 , 255 , 0 ) ) ,
348
+ ) )
349
+ . emission_shape ( EmissionShape :: Circle ( mint:: Point2 { x : 0.0 , y : 0.0 } , 200.0 ) )
350
+ . build ( ) , barrel_start_x, -HEIGHT2 + 70. , 0 )
351
+ ) ;
352
+
353
+ self . audio_resources [ 1 ] . play ( ) . expect ( "Cannot play Some(explode).mp3" ) ;
354
+
355
+ self . barrels . remove ( i) ;
282
356
283
357
done = true ;
284
358
}
@@ -288,7 +362,7 @@ impl Game {
288
362
let cam_loc = self . camera . ___location ( ) ;
289
363
let org_pos = cam_loc. data . as_slice ( ) ;
290
364
291
- self . elapsed_shake = Some ( ( 0. , Vec2 :: new ( org_pos[ 0 ] , org_pos[ 1 ] ) ) ) ;
365
+ self . elapsed_shake = Some ( ( 0. , Vec2 :: new ( org_pos[ 0 ] , org_pos[ 1 ] ) , 5. ) ) ;
292
366
self . camera_shakeke ( ) ;
293
367
294
368
break ;
@@ -372,14 +446,14 @@ impl Game {
372
446
pub fn camera_shakeke ( & mut self ) {
373
447
let mut rng = rand:: thread_rng ( ) ;
374
448
375
- let magnitude = 3. ;
376
449
let elapsed = self . elapsed_shake . unwrap ( ) ;
450
+ let magnitude = elapsed. 2 ;
377
451
378
452
let x = rng. gen_range ( -1.0 , 1.0 ) * magnitude;
379
453
let y = rng. gen_range ( -1.0 , 1.0 ) * magnitude;
380
454
381
455
self . camera . move_by ( Vec2 :: new ( x, y) ) ;
382
456
383
- self . elapsed_shake = Some ( ( elapsed. 0 + 0.1 , elapsed. 1 ) ) ;
457
+ self . elapsed_shake = Some ( ( elapsed. 0 + 0.1 , elapsed. 1 , magnitude ) ) ;
384
458
}
385
459
}
0 commit comments