From 422535c00d708119b12c74e1bd4dbf2e7e8ede32 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sat, 9 Sep 2023 21:10:41 -0500 Subject: [PATCH] feat: direction propagation, change direction at precise times --- src/entity.rs | 1 + src/game.rs | 8 ++++---- src/pacman.rs | 22 +++++++++++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/entity.rs b/src/entity.rs index 82bb97f..ce521b0 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -5,6 +5,7 @@ pub trait Entity { fn position(&self) -> (i32, i32); // Returns the cell position of the entity (XY position within the grid) fn cell_position(&self) -> (u32, u32); + fn internal_position(&self) -> (u32, u32); // Tick the entity (move it, perform collision checks, etc) fn tick(&mut self); } \ No newline at end of file diff --git a/src/game.rs b/src/game.rs index eec8a26..a443f5d 100644 --- a/src/game.rs +++ b/src/game.rs @@ -39,16 +39,16 @@ impl Game<'_> { pub fn keyboard_event(&mut self, keycode: Keycode) { match keycode { Keycode::D => { - self.pacman.direction = Direction::Right; + self.pacman.next_direction = Some(Direction::Right); } Keycode::A => { - self.pacman.direction = Direction::Left; + self.pacman.next_direction = Some(Direction::Left); } Keycode::W => { - self.pacman.direction = Direction::Up; + self.pacman.next_direction = Some(Direction::Up); } Keycode::S => { - self.pacman.direction = Direction::Down; + self.pacman.next_direction = Some(Direction::Down); } Keycode::Space => { self.debug = !self.debug; diff --git a/src/pacman.rs b/src/pacman.rs index 1bc5c9b..11ef8ac 100644 --- a/src/pacman.rs +++ b/src/pacman.rs @@ -3,12 +3,13 @@ use sdl2::{ video::Window, }; -use crate::{animation::AnimatedTexture, direction::Direction, entity::Entity}; +use crate::{animation::AnimatedTexture, direction::Direction, entity::Entity, constants::CELL_SIZE}; pub struct Pacman<'a> { // Absolute position on the board (precise) pub position: (i32, i32), pub direction: Direction, + pub next_direction: Option, speed: u32, sprite: AnimatedTexture<'a>, } @@ -18,8 +19,9 @@ impl Pacman<'_> { Pacman { position: starting_position.unwrap_or((0i32, 0i32)), direction: Direction::Right, + next_direction: None, speed: 2, - sprite: AnimatedTexture::new(atlas, 4, 3, 32, 32), + sprite: AnimatedTexture::new(atlas, 4, 3, 32, 32, Some((-4, -4))), } } @@ -41,10 +43,24 @@ impl Entity for Pacman<'_> { fn cell_position(&self) -> (u32, u32) { let (x, y) = self.position(); - (x as u32 / 24, y as u32 / 24) + (x as u32 / CELL_SIZE, y as u32 / CELL_SIZE) + } + + fn internal_position(&self) -> (u32, u32) { + let (x, y) = self.position(); + (x as u32 % CELL_SIZE, y as u32 % CELL_SIZE) } 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 => {