summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/player.rs104
-rw-r--r--src/state.rs26
2 files changed, 121 insertions, 9 deletions
diff --git a/src/player.rs b/src/player.rs
index 66e7d28..976ab05 100644
--- a/src/player.rs
+++ b/src/player.rs
@@ -1,3 +1,4 @@
+use ggez::event::KeyCode;
use ggez::graphics::{spritebatch::SpriteBatch, DrawParam};
use ggez::nalgebra::{Point2, Vector2};
@@ -6,12 +7,14 @@ use crate::tileset::Tileset;
pub struct Player {
pub position: Point2<f32>,
+ state: PlayerState,
}
impl Player {
pub fn new() -> Player {
Player {
position: Point2::new(0.0, 0.0),
+ state: PlayerState::Idle,
}
}
@@ -23,4 +26,105 @@ impl Player {
spritebatch.add(draw_param);
}
+
+ pub fn update(&mut self) {
+ match self.state {
+ PlayerState::MovingUp => self.position.y -= constants::PLAYER_SPEED,
+ PlayerState::MovingUpLeft => {
+ self.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ self.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ }
+ PlayerState::MovingUpRight => {
+ self.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ self.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ }
+ PlayerState::MovingLeft => self.position.x -= constants::PLAYER_SPEED,
+ PlayerState::MovingDown => self.position.y += constants::PLAYER_SPEED,
+ PlayerState::MovingDownLeft => {
+ self.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ self.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ }
+ PlayerState::MovingDownRight => {
+ self.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ self.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt();
+ }
+ PlayerState::MovingRight => self.position.x += constants::PLAYER_SPEED,
+ PlayerState::Idle => (),
+ }
+ }
+
+ pub fn give_key_down(&mut self, keycode: KeyCode) {
+ let original_state = self.state.clone();
+
+ self.state = match keycode {
+ KeyCode::W => match original_state {
+ PlayerState::MovingLeft => PlayerState::MovingUpLeft,
+ PlayerState::MovingRight => PlayerState::MovingUpRight,
+ _ => PlayerState::MovingUp,
+ },
+ KeyCode::A => match original_state {
+ PlayerState::MovingUp => PlayerState::MovingUpLeft,
+ PlayerState::MovingDown => PlayerState::MovingDownLeft,
+ _ => PlayerState::MovingLeft,
+ },
+ KeyCode::S => match original_state {
+ PlayerState::MovingLeft => PlayerState::MovingDownLeft,
+ PlayerState::MovingRight => PlayerState::MovingDownRight,
+ _ => PlayerState::MovingDown,
+ },
+ KeyCode::D => match original_state {
+ PlayerState::MovingUp => PlayerState::MovingUpRight,
+ PlayerState::MovingDown => PlayerState::MovingDownRight,
+ _ => PlayerState::MovingRight,
+ },
+ _ => original_state,
+ }
+ }
+
+ pub fn give_key_up(&mut self, keycode: KeyCode) {
+ let original_state = self.state.clone();
+
+ self.state = match keycode {
+ KeyCode::W => match original_state {
+ PlayerState::MovingUpLeft => PlayerState::MovingLeft,
+ PlayerState::MovingUpRight => PlayerState::MovingRight,
+ _ => PlayerState::Idle,
+ },
+ KeyCode::A => match original_state {
+ PlayerState::MovingUpLeft => PlayerState::MovingUp,
+ PlayerState::MovingDownLeft => PlayerState::MovingDown,
+ _ => PlayerState::Idle,
+ },
+ KeyCode::S => match original_state {
+ PlayerState::MovingDownLeft => PlayerState::MovingLeft,
+ PlayerState::MovingDownRight => PlayerState::MovingRight,
+ _ => PlayerState::Idle,
+ },
+ KeyCode::D => match original_state {
+ PlayerState::MovingUpRight => PlayerState::MovingUp,
+ PlayerState::MovingDownRight => PlayerState::MovingDown,
+ _ => PlayerState::Idle,
+ },
+ _ => original_state,
+ }
+ }
+}
+
+impl Default for Player {
+ fn default() -> Self {
+ Player::new()
+ }
+}
+
+#[derive(Clone)]
+enum PlayerState {
+ Idle,
+ MovingUp,
+ MovingDown,
+ MovingLeft,
+ MovingRight,
+ MovingUpLeft,
+ MovingUpRight,
+ MovingDownLeft,
+ MovingDownRight,
}
diff --git a/src/state.rs b/src/state.rs
index d63a763..299ecc9 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -3,7 +3,6 @@ use ggez::graphics::{self, spritebatch::SpriteBatch, DrawParam, FilterMode, Imag
use ggez::{filesystem, Context, GameResult};
use crate::camera::Camera;
-use crate::constants;
use crate::map::Map;
use crate::player::Player;
use crate::tileset::Tileset;
@@ -36,6 +35,7 @@ impl State {
impl EventHandler for State {
fn update(&mut self, _: &mut Context) -> GameResult {
+ self.player.update();
self.camera.give_center(self.player.position);
Ok(())
}
@@ -59,14 +59,22 @@ impl EventHandler for State {
Ok(())
}
- fn key_down_event(&mut self, context: &mut Context, keycode: KeyCode, _: KeyMods, _: bool) {
- match keycode {
- KeyCode::W => self.player.position.y -= constants::PLAYER_SPEED,
- KeyCode::A => self.player.position.x -= constants::PLAYER_SPEED,
- KeyCode::S => self.player.position.y += constants::PLAYER_SPEED,
- KeyCode::D => self.player.position.x += constants::PLAYER_SPEED,
- KeyCode::Q => context.continuing = false,
- _ => (),
+ fn key_down_event(
+ &mut self,
+ context: &mut Context,
+ keycode: KeyCode,
+ _: KeyMods,
+ repeat: bool,
+ ) {
+ if !repeat {
+ match keycode {
+ KeyCode::Q => context.continuing = false,
+ _ => self.player.give_key_down(keycode),
+ }
}
}
+
+ fn key_up_event(&mut self, _: &mut Context, keycode: KeyCode, _: KeyMods) {
+ self.player.give_key_up(keycode)
+ }
}