- commit
- 8c2f6384e6adcf1e6dbfcd1d1faa50752ec5386e
- parent
- d4ea28b4263fa72330c688ccbfd73045dde50f3c
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2023-02-19 18:53
reusable position type
Diffstat
| M | src/enemies.rs | 7 | +++---- |
| M | src/game.rs | 66 | ++++++++++++++++++++++++++++++------------------------------ |
2 files changed, 36 insertions, 37 deletions
diff --git a/src/enemies.rs b/src/enemies.rs
@@ -1,5 +1,6 @@ 1 1 // https://vampire-survivors.fandom.com/wiki/Enemies 2 2 -1 3 use crate::game::Pos; 3 4 use crate::sprites; 4 5 5 6 pub struct EnemyType { @@ -11,8 +12,7 @@ pub struct EnemyType { 11 12 } 12 13 13 14 pub struct Enemy {14 -1 pub x: f32,15 -1 pub y: f32,-1 15 pub p: Pos, 16 16 pub health: f32, 17 17 pub t: &'static EnemyType, 18 18 } @@ -154,8 +154,7 @@ pub fn get_enemy(x: f32, y: f32, i: usize) -> Enemy { 154 154 let t = wave[i % wave.len()]; 155 155 156 156 return Enemy {157 -1 x: x,158 -1 y: y,-1 157 p: Pos { x: x, y: y }, 159 158 health: t.health, 160 159 t: t, 161 160 };
diff --git a/src/game.rs b/src/game.rs
@@ -22,14 +22,13 @@ pub enum Dir {
22 22 Stop,
23 23 }
24 24
25 -1 pub struct Diamond {
-1 25 pub struct Pos {
26 26 pub x: f32,
27 27 pub y: f32,
28 28 }
29 29
30 30 pub struct Player {
31 -1 pub x: f32,
32 -1 pub y: f32,
-1 31 pub p: Pos,
33 32 pub dir: Dir,
34 33 pub face: Dir,
35 34 pub speed: f32,
@@ -48,8 +47,7 @@ pub struct Player {
48 47 impl Player {
49 48 pub fn new() -> Self {
50 49 return Self {
51 -1 x: 0.0,
52 -1 y: 0.0,
-1 50 p: Pos { x: 0.0, y: 0.0 },
53 51 dir: Dir::Stop,
54 52 face: Dir::Right,
55 53 speed: 30.0,
@@ -105,7 +103,7 @@ impl Player {
105 103
106 104 pub struct Game {
107 105 pub player: Player,
108 -1 pub diamonds: Vec<Diamond>,
-1 106 pub diamonds: Vec<Pos>,
109 107 pub enemies: Vec<enemies::Enemy>,
110 108 pub i_enemy: usize,
111 109 rng: random::Rng,
@@ -124,10 +122,10 @@ impl Game {
124 122
125 123 fn move_player(&mut self, dt: f32) {
126 124 match self.player.dir {
127 -1 Dir::Up => self.player.y -= self.player.speed * dt,
128 -1 Dir::Right => self.player.x += self.player.speed * dt,
129 -1 Dir::Down => self.player.y += self.player.speed * dt,
130 -1 Dir::Left => self.player.x -= self.player.speed * dt,
-1 125 Dir::Up => self.player.p.y -= self.player.speed * dt,
-1 126 Dir::Right => self.player.p.x += self.player.speed * dt,
-1 127 Dir::Down => self.player.p.y += self.player.speed * dt,
-1 128 Dir::Left => self.player.p.x -= self.player.speed * dt,
131 129 Dir::Stop => {}
132 130 };
133 131 }
@@ -136,8 +134,8 @@ impl Game {
136 134 for i in 0..self.enemies.len() {
137 135 let enemy = &self.enemies[i];
138 136
139 -1 let dxp = self.player.x - enemy.x;
140 -1 let dyp = self.player.y - enemy.y;
-1 137 let dxp = self.player.p.x - enemy.p.x;
-1 138 let dyp = self.player.p.y - enemy.p.y;
141 139 let dp = (dxp * dxp + dyp * dyp).sqrt();
142 140
143 141 let mut dx = dxp / dp;
@@ -147,8 +145,8 @@ impl Game {
147 145 if i != j {
148 146 let other = &self.enemies[j];
149 147
150 -1 let dxm = other.x - enemy.x;
151 -1 let dym = other.y - enemy.y;
-1 148 let dxm = other.p.x - enemy.p.x;
-1 149 let dym = other.p.y - enemy.p.y;
152 150 let dm = (dxm * dxm + dym * dym).sqrt();
153 151
154 152 if dm < enemy.t.size + other.t.size {
@@ -163,8 +161,8 @@ impl Game {
163 161 dy /= d;
164 162
165 163 let mut enemy = &mut self.enemies[i];
166 -1 enemy.x += dx * enemy.t.speed * dt;
167 -1 enemy.y += dy * enemy.t.speed * dt;
-1 164 enemy.p.x += dx * enemy.t.speed * dt;
-1 165 enemy.p.y += dy * enemy.t.speed * dt;
168 166 }
169 167 }
170 168
@@ -182,8 +180,8 @@ impl Game {
182 180 };
183 181
184 182 self.enemies.push(enemies::get_enemy(
185 -1 spawn_x + self.player.x - width / 2.0,
186 -1 spawn_y + self.player.y - height / 2.0,
-1 183 spawn_x + self.player.p.x - width / 2.0,
-1 184 spawn_y + self.player.p.y - height / 2.0,
187 185 self.i_enemy,
188 186 ));
189 187 self.i_enemy += 1;
@@ -193,14 +191,16 @@ impl Game {
193 191 fn despawn_enemies(&mut self, width: f32, height: f32) {
194 192 self.enemies = std::mem::take(&mut self.enemies)
195 193 .into_iter()
196 -1 .filter(|e| (e.y - self.player.y).abs() < height && (e.x - self.player.x).abs() < width)
-1 194 .filter(|e| {
-1 195 (e.p.y - self.player.p.y).abs() < height && (e.p.x - self.player.p.x).abs() < width
-1 196 })
197 197 .collect();
198 198 }
199 199
200 200 fn apply_damage(&mut self, dt: f32) {
201 201 for enemy in self.enemies.iter_mut() {
202 -1 let dx = self.player.x - enemy.x;
203 -1 let dy = self.player.y - enemy.y;
-1 202 let dx = self.player.p.x - enemy.p.x;
-1 203 let dy = self.player.p.y - enemy.p.y;
204 204 let dx2 = dx * dx;
205 205 let dy2 = dy * dy;
206 206
@@ -218,9 +218,9 @@ impl Game {
218 218 .into_iter()
219 219 .filter(|enemy| {
220 220 if enemy.health <= 0.0 {
221 -1 self.diamonds.push(Diamond {
222 -1 x: enemy.x,
223 -1 y: enemy.y,
-1 221 self.diamonds.push(Pos {
-1 222 x: enemy.p.x,
-1 223 y: enemy.p.y,
224 224 });
225 225 return false;
226 226 } else {
@@ -234,8 +234,8 @@ impl Game {
234 234 self.diamonds = std::mem::take(&mut self.diamonds)
235 235 .into_iter()
236 236 .filter(|diamond| {
237 -1 let dx = self.player.x - diamond.x;
238 -1 let dy = self.player.y - diamond.y;
-1 237 let dx = self.player.p.x - diamond.x;
-1 238 let dy = self.player.p.y - diamond.y;
239 239 let d = dx * dx + dy * dy;
240 240 if d < self.player.diamond_radius * self.player.diamond_radius {
241 241 self.player.xp += 1;
@@ -263,8 +263,8 @@ impl Game {
263 263 pub fn render(&mut self, win: &mut win::Window) {
264 264 let height = win::iconvert_y(win.height);
265 265 let width = win::iconvert_x(win.width);
266 -1 let dx = width / 2.0 - self.player.x;
267 -1 let dy = height / 2.0 - self.player.y;
-1 266 let dx = width / 2.0 - self.player.p.x;
-1 267 let dy = height / 2.0 - self.player.p.y;
268 268
269 269 win.fill([0x33, 0x88, 0x22]);
270 270 win.circle(
@@ -279,9 +279,9 @@ impl Game {
279 279 }
280 280
281 281 let mut player_rendered = false;
282 -1 self.enemies.sort_unstable_by_key(|e| e.y as i32);
-1 282 self.enemies.sort_unstable_by_key(|e| e.p.y as i32);
283 283 for enemy in self.enemies.iter() {
284 -1 if !player_rendered && enemy.y > self.player.y {
-1 284 if !player_rendered && enemy.p.y > self.player.p.y {
285 285 win.sprite(
286 286 width / 2.0,
287 287 height / 2.0,
@@ -292,10 +292,10 @@ impl Game {
292 292 }
293 293
294 294 win.sprite(
295 -1 enemy.x + dx,
296 -1 enemy.y + dy,
-1 295 enemy.p.x + dx,
-1 296 enemy.p.y + dy,
297 297 enemy.t.sprite,
298 -1 enemy.x > self.player.x,
-1 298 enemy.p.x > self.player.p.x,
299 299 );
300 300 }
301 301 if !player_rendered {