diff --git a/src/main.rs b/src/main.rs index 1c94263..06f8bf3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ mod direction; mod entity; mod game; mod pacman; +mod modulation; #[cfg(target_os = "emscripten")] mod emscripten; diff --git a/src/modulation.rs b/src/modulation.rs new file mode 100644 index 0000000..f6f1605 --- /dev/null +++ b/src/modulation.rs @@ -0,0 +1,26 @@ +pub struct SpeedModulator { + tick_count: u32, + ticks_left: u32, +} + +impl SpeedModulator { + pub fn new(percent: f32) -> Self { + let ticks_required: u32 = (1f32 / (1f32 - percent)).round() as u32; + + SpeedModulator { + tick_count: ticks_required, + ticks_left: ticks_required, + } + } + + pub fn next(&mut self) -> bool { + self.ticks_left -= 1; + + if self.ticks_left == 0 { + self.ticks_left = self.tick_count; + false + } else { + true + } + } +} diff --git a/src/pacman.rs b/src/pacman.rs index 11ef8ac..879af6d 100644 --- a/src/pacman.rs +++ b/src/pacman.rs @@ -3,7 +3,10 @@ use sdl2::{ video::Window, }; -use crate::{animation::AnimatedTexture, direction::Direction, entity::Entity, constants::CELL_SIZE}; +use crate::{ + animation::AnimatedTexture, constants::CELL_SIZE, direction::Direction, entity::Entity, + modulation::SpeedModulator, +}; pub struct Pacman<'a> { // Absolute position on the board (precise) @@ -11,6 +14,7 @@ pub struct Pacman<'a> { pub direction: Direction, pub next_direction: Option, speed: u32, + modulation: SpeedModulator, sprite: AnimatedTexture<'a>, } @@ -21,6 +25,7 @@ impl Pacman<'_> { direction: Direction::Right, next_direction: None, speed: 2, + modulation: SpeedModulator::new(0.9333), sprite: AnimatedTexture::new(atlas, 4, 3, 32, 32, Some((-4, -4))), } } @@ -53,27 +58,28 @@ impl Entity for Pacman<'_> { fn tick(&mut self) { let can_change = self.internal_position() == (0, 0); - println!("{:?} ({:?})", self.internal_position(), can_change); if can_change { if let Some(direction) = self.next_direction { self.direction = direction; self.next_direction = None; } } - - let speed = self.speed as i32; - match self.direction { - Direction::Right => { - self.position.0 += speed; - } - Direction::Left => { - self.position.0 -= speed; - } - Direction::Up => { - self.position.1 -= speed; - } - Direction::Down => { - self.position.1 += speed; + + if self.modulation.next() { + let speed = self.speed as i32; + match self.direction { + Direction::Right => { + self.position.0 += speed; + } + Direction::Left => { + self.position.0 -= speed; + } + Direction::Up => { + self.position.1 -= speed; + } + Direction::Down => { + self.position.1 += speed; + } } } }