- commit
- 3d5cca8310af0dd53818b05ffd43012e5398e474
- parent
- 0a3ae6623d8bc7398ea15a9b9c35aacea1bca8fd
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2023-03-26 21:52
add weapon struct
Diffstat
| M | src/game.rs | 89 | +++++++++++++++++++++++++++++++++---------------------------- |
| M | src/weapons.rs | 37 | ++++++++++++++++++++++++++++++------- |
2 files changed, 78 insertions, 48 deletions
diff --git a/src/game.rs b/src/game.rs
@@ -47,6 +47,7 @@ pub struct Player {
47 47 pub health_max: f32,
48 48 pub health_recover: f32,
49 49 pub power: f32,
-1 50 pub weapons: Vec<weapons::Weapon>,
50 51 pub damage_radius: f32,
51 52 pub diamond_radius: f32,
52 53 pub xp: f32,
@@ -67,6 +68,9 @@ impl Player {
67 68 health_max: 50.0,
68 69 health_recover: 0.0,
69 70 power: 10.0,
-1 71 weapons: vec![
-1 72 weapons::Weapon::new(&weapons::KNIFE),
-1 73 ],
70 74 damage_radius: 30.0,
71 75 diamond_radius: 15.0,
72 76 xp: 0.0,
@@ -106,9 +110,6 @@ pub struct Game {
106 110 pub player: Player,
107 111 pub diamonds: Vec<Pos>,
108 112 pub enemies: Vec<enemies::Enemy>,
109 -1 pub projectiles: Vec<weapons::Projectile>,
110 -1 pub projectiles_cooldown: f32,
111 -1 pub projectiles_last: f32,
112 113 pub i_enemy: usize,
113 114 rng: random::Rng,
114 115 }
@@ -117,9 +118,6 @@ impl Game {
117 118 pub fn new() -> Self {
118 119 return Self {
119 120 enemies: vec![],
120 -1 projectiles: vec![],
121 -1 projectiles_last: 0.0,
122 -1 projectiles_cooldown: 4.0,
123 121 diamonds: vec![],
124 122 i_enemy: 0,
125 123 player: Player::new(),
@@ -174,12 +172,14 @@ impl Game {
174 172 }
175 173
176 174 fn move_projectiles(&mut self, dt: f32) {
177 -1 for projectile in self.projectiles.iter_mut() {
178 -1 match projectile.dir {
179 -1 Dir::Up => projectile.p.y -= projectile.t.speed * dt,
180 -1 Dir::Right => projectile.p.x += projectile.t.speed * dt,
181 -1 Dir::Down => projectile.p.y += projectile.t.speed * dt,
182 -1 Dir::Left => projectile.p.x -= projectile.t.speed * dt,
-1 175 for weapon in self.player.weapons.iter_mut() {
-1 176 for projectile in weapon.projectiles.iter_mut() {
-1 177 match projectile.dir {
-1 178 Dir::Up => projectile.p.y -= weapon.speed * dt,
-1 179 Dir::Right => projectile.p.x += weapon.speed * dt,
-1 180 Dir::Down => projectile.p.y += weapon.speed * dt,
-1 181 Dir::Left => projectile.p.x -= weapon.speed * dt,
-1 182 }
183 183 }
184 184 }
185 185 }
@@ -216,28 +216,31 @@ impl Game {
216 216 }
217 217
218 218 fn spawn_projectiles(&mut self, dt: f32) {
219 -1 self.projectiles_last += dt;
220 -1 if self.projectiles_last > self.projectiles_cooldown {
221 -1 self.projectiles_last -= self.projectiles_cooldown;
222 -1 self.projectiles.push(weapons::Projectile {
223 -1 p: self.player.p,
224 -1 dir: match &self.player.dir {
225 -1 Some(dir) => dir.clone(),
226 -1 None => self.player.face,
227 -1 },
228 -1 t: &weapons::KNIFE,
229 -1 });
-1 219 for weapon in self.player.weapons.iter_mut() {
-1 220 weapon.last += dt;
-1 221 if weapon.last > weapon.cooldown {
-1 222 weapon.last -= weapon.cooldown;
-1 223 weapon.projectiles.push(weapons::Projectile {
-1 224 p: self.player.p,
-1 225 dir: match &self.player.dir {
-1 226 Some(dir) => dir.clone(),
-1 227 None => self.player.face,
-1 228 },
-1 229 });
-1 230 }
230 231 }
231 232 }
232 233
233 234 fn despawn_projectiles(&mut self, width: f32, height: f32) {
234 -1 self.projectiles = std::mem::take(&mut self.projectiles)
235 -1 .into_iter()
236 -1 .filter(|proj| {
237 -1 (proj.p.y - self.player.p.y).abs() < height
238 -1 && (proj.p.x - self.player.p.x).abs() < width
239 -1 })
240 -1 .collect();
-1 235 for weapon in self.player.weapons.iter_mut() {
-1 236 weapon.projectiles = std::mem::take(&mut weapon.projectiles)
-1 237 .into_iter()
-1 238 .filter(|proj| {
-1 239 (proj.p.y - self.player.p.y).abs() < height
-1 240 && (proj.p.x - self.player.p.x).abs() < width
-1 241 })
-1 242 .collect();
-1 243 }
241 244 }
242 245
243 246 fn apply_damage(&mut self, dt: f32) {
@@ -255,10 +258,12 @@ impl Game {
255 258 if dx2 + dy2 < self.player.damage_radius * self.player.damage_radius {
256 259 enemy.health -= self.player.power * dt;
257 260 }
258 -1 for projectile in self.projectiles.iter() {
259 -1 let projectile_size = enemy.t.size + projectile.t.size;
260 -1 if projectile.p.in_radius(&enemy.p, projectile_size) {
261 -1 enemy.health -= projectile.t.damage * self.player.power * dt;
-1 261 for weapon in self.player.weapons.iter() {
-1 262 for projectile in weapon.projectiles.iter() {
-1 263 let projectile_size = enemy.t.size + weapon.t.size;
-1 264 if projectile.p.in_radius(&enemy.p, projectile_size) {
-1 265 enemy.health -= weapon.damage * self.player.power * dt;
-1 266 }
262 267 }
263 268 }
264 269 }
@@ -356,13 +361,15 @@ impl Game {
356 361 );
357 362 }
358 363
359 -1 for projectile in self.projectiles.iter() {
360 -1 win.sprite(
361 -1 projectile.p.x + dx,
362 -1 projectile.p.y + dy,
363 -1 projectile.t.sprite,
364 -1 projectile.dir,
365 -1 );
-1 364 for weapon in self.player.weapons.iter() {
-1 365 for projectile in weapon.projectiles.iter() {
-1 366 win.sprite(
-1 367 projectile.p.x + dx,
-1 368 projectile.p.y + dy,
-1 369 weapon.t.sprite,
-1 370 projectile.dir,
-1 371 );
-1 372 }
366 373 }
367 374 }
368 375 }
diff --git a/src/weapons.rs b/src/weapons.rs
@@ -1,22 +1,45 @@ 1 1 use crate::game::{Dir, Pos}; 2 2 use crate::sprites; 3 34 -1 pub struct ProjectileType {5 -1 pub speed: f32,-1 4 pub struct WeaponType { -1 5 pub base_speed: f32, -1 6 pub base_damage: f32, -1 7 pub base_cooldown: f32, 6 8 pub size: f32,7 -1 pub damage: f32,8 9 pub sprite: &'static sprites::Sprite, 9 10 } 10 11 11 12 pub struct Projectile { 12 13 pub p: Pos, 13 14 pub dir: Dir,14 -1 pub t: &'static ProjectileType,15 15 } 16 1617 -1 pub const KNIFE: ProjectileType = ProjectileType {18 -1 speed: 200.0,-1 17 pub struct Weapon { -1 18 pub speed: f32, -1 19 pub damage: f32, -1 20 pub cooldown: f32, -1 21 pub last: f32, -1 22 pub t: &'static WeaponType, -1 23 pub projectiles: Vec<Projectile>, -1 24 } -1 25 -1 26 impl Weapon { -1 27 pub fn new(t: &'static WeaponType) -> Self { -1 28 return Self { -1 29 speed: t.base_speed, -1 30 damage: t.base_damage, -1 31 cooldown: t.base_cooldown, -1 32 last: 0.0, -1 33 t: t, -1 34 projectiles: vec![], -1 35 } -1 36 } -1 37 } -1 38 -1 39 pub const KNIFE: WeaponType = WeaponType { -1 40 base_speed: 200.0, -1 41 base_damage: 30.0, -1 42 base_cooldown: 4.0, 19 43 size: 6.0,20 -1 damage: 30.0,21 44 sprite: &sprites::KNIFE, 22 45 };