Skip to content

Commit ab47f5f

Browse files
author
Milos Zivkovic
committed
life manager
1 parent f7e37bc commit ab47f5f

File tree

4 files changed

+35
-10
lines changed

4 files changed

+35
-10
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/player.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
use crate::prelude::*;
22

3+
pub struct PlayerKilledEvent;
4+
35
#[derive(Component)]
46
pub struct Player {
57
fire_rate: f32,
8+
lives: i32,
69
}
710

811
impl Player {
@@ -20,7 +23,8 @@ impl Player {
2023
..Default::default()
2124
})
2225
.insert(Player {
23-
fire_rate: 10.0
26+
fire_rate: 10.0,
27+
lives: 3,
2428
})
2529
.insert(Wrappable)
2630
.insert(Movement {
@@ -29,6 +33,11 @@ impl Player {
2933
});
3034
}
3135

36+
pub fn loose_life(&mut self) {
37+
self.lives -= 1;
38+
self.lives = self.lives.max(0);
39+
}
40+
3241
pub fn fire_rate(&self) -> f32 {
3342
1.0 / self.fire_rate
3443
}

src/game_systems.rs

+21-7
Original file line numberDiff line numberDiff line change
@@ -115,22 +115,36 @@ pub fn destroy_asteroid(
115115
}
116116

117117
pub fn destroy_player(
118-
mut commands: Commands,
119118
atlas_manager: Res<AtlasManager>,
120119
atlases: ResMut<Assets<TextureAtlas>>,
121-
player: Query<(Entity, &Transform), With<Player>>,
120+
mut ev_player: EventWriter<PlayerKilledEvent>,
121+
player: Query<&Transform, With<Player>>,
122122
asteroids: Query<(&TextureAtlasSprite, &Transform), With<Asteroid>>,
123123
) {
124-
let (pe, player) = match player.get_single() {
124+
let p_position = match player.get_single() {
125125
Ok(q) => q,
126126
Err(_) => return
127127
};
128128
let atlas = atlases.get(&atlas_manager.texture_atlas).expect("Texture atlas not found");
129129
for (sprite, asteroid) in asteroids.iter() {
130130
let size = atlas.textures.get(sprite.index).expect("Texture size not found");
131-
if in_bounds(player.translation, asteroid.translation, size.width(), size.height()) {
132-
commands.entity(pe).despawn();
133-
Player::spawn(&mut commands, &atlas_manager, Vec3::ZERO);
131+
if in_bounds(p_position.translation, asteroid.translation, size.width(), size.height()) {
132+
ev_player.send(PlayerKilledEvent);
134133
}
135134
}
136-
}
135+
}
136+
137+
pub fn lives_manager(
138+
mut player_query: Query<(&mut Player)>,
139+
mut events: EventReader<PlayerKilledEvent>,
140+
) {
141+
let mut player = match player_query.get_single_mut() {
142+
Ok(q) => q,
143+
Err(_) => return
144+
};
145+
146+
for _ in events.iter() {
147+
player.loose_life();
148+
}
149+
}
150+

src/main.rs

+2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@ fn main() {
3333
.add_plugins(DefaultPlugins)
3434
.add_plugin(AssetManagerPlugin)
3535
.add_startup_system(load_game)
36+
.add_event::<PlayerKilledEvent>()
3637
.add_system(game_systems::player_movement)
3738
.add_system(game_systems::wrap_window)
3839
.add_system(game_systems::expend)
3940
.add_system(game_systems::auto_move)
4041
.add_system(game_systems::player_action)
4142
.add_system(game_systems::destroy_asteroid)
4243
.add_system(game_systems::destroy_player)
44+
.add_system(game_systems::lives_manager)
4345
.run();
4446
}
4547

0 commit comments

Comments
 (0)