@@ -8,6 +8,7 @@ use ggez::{
8
8
} ;
9
9
use ggez_goodies:: { camera:: Camera , nalgebra_glm:: Vec2 } ;
10
10
use graphics:: { Font , Image , Mesh , TextFragment } ;
11
+ use rand:: Rng ;
11
12
12
13
use crate :: { HEIGHT , Screen , WIDTH , components:: { bullet:: Turbofish , enemy:: Enemy , player:: Player , tile:: { Tile , TileType } } } ;
13
14
@@ -27,6 +28,7 @@ pub struct Game {
27
28
ui_resources : Vec < Image > ,
28
29
29
30
camera : Camera ,
31
+ elapsed_shake : Option < ( f32 , Vec2 ) > ,
30
32
}
31
33
32
34
impl Game {
@@ -122,6 +124,7 @@ impl Game {
122
124
camera,
123
125
124
126
consolas : graphics:: Font :: new ( ctx, "/fonts/Consolas.ttf" ) . unwrap ( ) ,
127
+ elapsed_shake : None
125
128
} )
126
129
}
127
130
@@ -222,7 +225,7 @@ impl Game {
222
225
223
226
let mut done: bool = false ;
224
227
225
- for fish in & mut self . player_bullets {
228
+ for fish in & self . player_bullets {
226
229
if fish. pos_x >= go_start_x && fish. pos_x <= go_end_x {
227
230
self . enemies . remove ( i) ;
228
231
@@ -231,6 +234,12 @@ impl Game {
231
234
}
232
235
233
236
if done {
237
+ let cam_loc = self . camera . ___location ( ) ;
238
+ let org_pos = cam_loc. data . as_slice ( ) ;
239
+
240
+ self . elapsed_shake = Some ( ( 0. , Vec2 :: new ( org_pos[ 0 ] , org_pos[ 1 ] ) ) ) ;
241
+ self . camera_shakeke ( ) ;
242
+
234
243
break ;
235
244
}
236
245
}
@@ -245,6 +254,17 @@ impl Game {
245
254
}
246
255
}
247
256
257
+ if let Some ( s) = self . elapsed_shake {
258
+ if s. 0 < 1. {
259
+ self . camera_shakeke ( ) ;
260
+ }
261
+
262
+ else {
263
+ self . camera . move_to ( s. 1 ) ;
264
+ self . elapsed_shake = None ;
265
+ }
266
+ }
267
+
248
268
Ok ( None )
249
269
}
250
270
@@ -269,4 +289,18 @@ impl Game {
269
289
270
290
None
271
291
}
292
+
293
+ pub fn camera_shakeke ( & mut self ) {
294
+ let mut rng = rand:: thread_rng ( ) ;
295
+
296
+ let magnitude = 2. ;
297
+ let elapsed = self . elapsed_shake . unwrap ( ) ;
298
+
299
+ let x = rng. gen_range ( -1.0 , 1.0 ) * magnitude;
300
+ let y = rng. gen_range ( -1.0 , 1.0 ) * magnitude;
301
+
302
+ self . camera . move_by ( Vec2 :: new ( x, y) ) ;
303
+
304
+ self . elapsed_shake = Some ( ( elapsed. 0 + 0.1 , elapsed. 1 ) ) ;
305
+ }
272
306
}
0 commit comments