From d3d77b58e38de4499151db60a3322b0d52aa8037 Mon Sep 17 00:00:00 2001 From: dawnDus <96957561+dawndus@users.noreply.github.com> Date: Sat, 29 Jan 2022 11:14:39 -0500 Subject: [PATCH] Refactor whimsical star --- src/components/whimsical_star.rs | 95 ++++++++++++++++---------------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/src/components/whimsical_star.rs b/src/components/whimsical_star.rs index 3a259f7..a393fba 100644 --- a/src/components/whimsical_star.rs +++ b/src/components/whimsical_star.rs @@ -21,18 +21,23 @@ pub struct Star { pub prev_y: i32, pub vel_x: i32, pub vel_y: i32, + pub rect: Rect<u16>, } impl Star { - fn new(vel_x: i32, vel_y: i32) -> Star { - Star { x: 0, y: 0, vel_x, vel_y, prev_x: 0, prev_y: 0 } + fn new(vel_x: i32, vel_y: i32, rect: Rect<u16>) -> Star { + Star { x: 0, y: 0, vel_x, vel_y, prev_x: 0, prev_y: 0, rect } } } impl WhimsicalStar { pub fn new() -> WhimsicalStar { WhimsicalStar { - star: [Star::new(0x400, -0x200), Star::new(-0x200, 0x400), Star::new(0x200, 0x200)], + star: [ + Star::new(0x400, -0x200, Rect { left: 192, top: 0, right: 200, bottom: 8 }), + Star::new(-0x200, 0x400, Rect { left: 192, top: 8, right: 200, bottom: 16 }), + Star::new(0x200, 0x200, Rect { left: 192, top: 16, right: 200, bottom: 24 }), + ], star_count: 0, equipped: false, active_star: 0, @@ -40,9 +45,9 @@ impl WhimsicalStar { } pub fn set_prev(&mut self) { - for iter in 0..=2 { - self.star[iter].prev_x = self.star[iter].x; - self.star[iter].prev_y = self.star[iter].y; + for star in &mut self.star { + star.prev_x = star.x; + star.prev_y = star.y; } } } @@ -54,9 +59,9 @@ impl GameEntity<(&Player, &mut BulletManager)> for WhimsicalStar { (player, bullet_manager): (&Player, &mut BulletManager), ) -> GameResult { if !self.equipped && player.equip.has_whimsical_star() { - for iter in 0..=2 { - self.star[iter].x = player.x; - self.star[iter].y = player.y; + for star in &mut self.star { + star.x = player.x; + star.y = player.y; } self.equipped = true; } @@ -68,39 +73,37 @@ impl GameEntity<(&Player, &mut BulletManager)> for WhimsicalStar { self.star_count = player.stars; + let mut prev_x = player.x; + let mut prev_y = player.y; + + for star in &mut self.star { + star.vel_x += if prev_x >= star.x { 0x80 } else { -0x80 }; + star.vel_y += if prev_y >= star.y { 0xAA } else { -0xAA }; + + star.vel_x = star.vel_x.clamp(-0xA00, 0xA00); + star.vel_y = star.vel_y.clamp(-0xA00, 0xA00); + + star.x += star.vel_x; + star.y += star.vel_y; + + prev_x = star.x; + prev_y = star.y; + } + // Only one star can deal damage per tick self.active_star += 1; self.active_star %= 3; - for iter in 0..3 { - if iter != 0 { - self.star[iter].vel_x += if self.star[iter - 1].x >= self.star[iter].x { 0x80 } else { -0x80 }; - self.star[iter].vel_y += if self.star[iter - 1].y >= self.star[iter].y { 0xAA } else { -0xAA }; - } else { - self.star[iter].vel_x += if player.x >= self.star[iter].x { 0x80 } else { -0x80 }; - self.star[iter].vel_y += if player.y >= self.star[iter].y { 0xAA } else { -0xAA }; - } - - self.star[iter].vel_x = self.star[iter].vel_x.clamp(-0xA00, 0xA00); - self.star[iter].vel_y = self.star[iter].vel_y.clamp(-0xA00, 0xA00); - - self.star[iter].x += self.star[iter].vel_x; - self.star[iter].y += self.star[iter].vel_y; - - if iter < self.star_count as usize - && state.control_flags.control_enabled() - && self.active_star == iter as u8 - { - let bullet = Bullet::new( - self.star[iter].x, - self.star[iter].y, - 45, - TargetPlayer::Player1, - Direction::Left, - &state.constants, - ); - bullet_manager.push_bullet(bullet); - } + if self.active_star < self.star_count && state.control_flags.control_enabled() { + let bullet = Bullet::new( + self.star[self.active_star as usize].x, + self.star[self.active_star as usize].y, + 45, + TargetPlayer::Player1, + Direction::Left, + &state.constants, + ); + bullet_manager.push_bullet(bullet); } Ok(()) @@ -115,18 +118,12 @@ impl GameEntity<(&Player, &mut BulletManager)> for WhimsicalStar { let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "MyChar")?; - const STAR_RECTS: [Rect<u16>; 3] = [ - Rect { left: 192, top: 0, right: 200, bottom: 8 }, - Rect { left: 192, top: 8, right: 200, bottom: 16 }, - Rect { left: 192, top: 16, right: 200, bottom: 24 }, - ]; + let (active_stars, _) = self.star.split_at(self.star_count as usize); - for iter in 0..self.star_count as usize { - let x = interpolate_fix9_scale(self.star[iter].prev_x as i32, self.star[iter].x as i32, state.frame_time) - - frame_x; - let y = interpolate_fix9_scale(self.star[iter].prev_y as i32, self.star[iter].y as i32, state.frame_time) - - frame_y; - batch.add_rect(x, y, &STAR_RECTS[iter]); + for star in active_stars { + let x = interpolate_fix9_scale(star.prev_x as i32, star.x as i32, state.frame_time) - frame_x; + let y = interpolate_fix9_scale(star.prev_y as i32, star.y as i32, state.frame_time) - frame_y; + batch.add_rect(x, y, &star.rect); } batch.draw(ctx)?;