Skip to content

Commit d295464

Browse files
Add BOOOM Barrels Explosives
1 parent 9b23747 commit d295464

File tree

5 files changed

+121
-11
lines changed

5 files changed

+121
-11
lines changed

resources/images/Some(barrel).png

21.7 KB
Loading

resources/maps/01.map

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[4-------]_[--8---8--]
1+
[-4------]_[--8---8---*-]

src/components/barrel.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use ggez::{Context, GameResult, graphics::Image};
2+
use ggez_goodies::{camera::{Camera, CameraDraw}, nalgebra_glm::Vec2};
3+
4+
use crate::HEIGHT;
5+
6+
pub struct Barrel {
7+
pub pos_x: f32
8+
}
9+
10+
impl Barrel {
11+
pub fn new(pos_x: f32) -> Self {
12+
Self {
13+
pos_x
14+
}
15+
}
16+
17+
pub fn draw(
18+
&mut self,
19+
ctx: &mut Context,
20+
camera: &Camera,
21+
resources: &Vec<Image>,
22+
) -> GameResult<()> {
23+
const HEIGHT2: f32 = HEIGHT / 2.;
24+
25+
26+
&resources[0].draw_camera(
27+
camera,
28+
ctx,
29+
Vec2::new(self.pos_x, -HEIGHT2 + (resources[0].height() + 40) as f32),
30+
0.
31+
);
32+
33+
Ok(())
34+
}
35+
}

src/game.rs

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,28 @@ use ggez_goodies::{camera::{Camera, CameraDraw}, nalgebra_glm::Vec2, particle::{
55
use graphics::{Font, Image, Mesh, TextFragment};
66
use rand::Rng;
77

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}}};
99

1010
pub struct Game {
1111
ground: Vec<Tile>,
1212
enemies: Vec<Enemy>,
13+
barrels: Vec<Barrel>,
14+
1315
player_bullets: Vec<Turbofish>,
1416
player: Player,
1517

1618
ground_resources: Vec<Image>,
1719
enemy_resources: Vec<Image>,
1820
player_resources: Vec<Image>,
1921
bullet_resources: Vec<Image>,
20-
21-
consolas: Font,
22-
2322
ui_resources: Vec<Image>,
2423
audio_resources: Vec<Source>,
24+
barrel_resources: Vec<Image>,
25+
26+
consolas: Font,
2527

2628
camera: Camera,
27-
elapsed_shake: Option<(f32, Vec2)>,
29+
elapsed_shake: Option<(f32, Vec2, f32)>,
2830
tics: Option<i32>,
2931
particles: Vec<(ParticleSystem, f32, f32, i32)>
3032
}
@@ -39,6 +41,8 @@ impl Game {
3941

4042
let mut ground = vec![];
4143
let mut enemies = vec![];
44+
let mut barrels = vec![];
45+
4246
let mut player = None;
4347

4448
let mut draw_pos = 0.;
@@ -80,6 +84,13 @@ impl Game {
8084
ground.push(Tile::new(draw_pos, TileType::CENTER));
8185
player = Some(Player::new(draw_pos));
8286

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+
8394
draw_pos += draw_inc;
8495
}
8596

@@ -95,6 +106,8 @@ impl Game {
95106
ground,
96107
enemies,
97108
player,
109+
barrels,
110+
98111
player_bullets: vec![],
99112

100113
ground_resources: vec![
@@ -117,7 +130,14 @@ impl Game {
117130
Image::new(ctx, "/images/Some(turbofish).png").unwrap(),
118131
],
119132

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+
121141
audio_resources: vec![
122142
Source::new(ctx, "/audio/Some(turbofish_shoot).mp3").unwrap(),
123143
Source::new(ctx, "/audio/Some(explode).mp3").unwrap()
@@ -157,6 +177,11 @@ impl Game {
157177
enemy.draw(ctx, &self.camera, &self.enemy_resources)?;
158178
}
159179

180+
// Barrel
181+
for boom in &mut self.barrels {
182+
boom.draw(ctx, &self.camera, &self.barrel_resources)?;
183+
}
184+
160185
// Player
161186
self.player
162187
.draw(ctx, &self.camera, &self.player_resources)?;
@@ -254,7 +279,9 @@ impl Game {
254279

255280
let mut done: bool = false;
256281

257-
for fish in &self.player_bullets {
282+
for j in 0..self.player_bullets.len() {
283+
let fish = &self.player_bullets[j];
284+
258285
if fish.pos_x >= go_start_x && fish.pos_x <= go_end_x {
259286
const HEIGHT2: f32 = HEIGHT / 2.;
260287

@@ -279,6 +306,53 @@ impl Game {
279306
self.audio_resources[1].play().expect("Cannot play Some(explode).mp3");
280307

281308
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);
282356

283357
done = true;
284358
}
@@ -288,7 +362,7 @@ impl Game {
288362
let cam_loc = self.camera.___location();
289363
let org_pos = cam_loc.data.as_slice();
290364

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.));
292366
self.camera_shakeke();
293367

294368
break;
@@ -372,14 +446,14 @@ impl Game {
372446
pub fn camera_shakeke(&mut self) {
373447
let mut rng = rand::thread_rng();
374448

375-
let magnitude = 3.;
376449
let elapsed = self.elapsed_shake.unwrap();
450+
let magnitude = elapsed.2;
377451

378452
let x = rng.gen_range(-1.0, 1.0) * magnitude;
379453
let y = rng.gen_range(-1.0, 1.0) * magnitude;
380454

381455
self.camera.move_by(Vec2::new(x, y));
382456

383-
self.elapsed_shake = Some((elapsed.0 + 0.1, elapsed.1));
457+
self.elapsed_shake = Some((elapsed.0 + 0.1, elapsed.1, magnitude));
384458
}
385459
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mod components {
1717
pub mod player;
1818
pub mod tile;
1919
pub mod bullet;
20+
pub mod barrel;
2021
}
2122

2223
const WIDTH: f32 = 1000.0;

0 commit comments

Comments
 (0)