diff options
Diffstat (limited to 'src/player.rs')
-rw-r--r-- | src/player.rs | 225 |
1 files changed, 79 insertions, 146 deletions
diff --git a/src/player.rs b/src/player.rs index 6440587..ae43d80 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,206 +1,139 @@ use ggez::event::KeyCode; -use ggez::graphics::{spritebatch::SpriteBatch, DrawParam, Rect}; +use ggez::graphics::{spritebatch::SpriteBatch, DrawParam}; use ggez::nalgebra::{Point2, Vector2}; -use std::collections::HashMap; -use std::time::Instant; +use crate::animation::Animation; use crate::constants; -use crate::math::{flip, next_source}; +use crate::entity::{Action, Entity, Operable}; use crate::tileset::Tileset; pub struct Player { - pub position: Point2<f32>, - state: AnimationState, - source: Rect, - timer: Instant, - animation: Vec<(usize, Rect)>, - animations: HashMap<AnimationState, Vec<(usize, Rect)>>, - map_height: f32, - map_width: f32, + entity: Entity, + animation: Animation, } -impl Player { - pub fn new(tileset: &Tileset, dimensions: (f32, f32)) -> Player { - Player { - position: Point2::new(0.0, 0.0), - state: AnimationState::IdleLeft, - source: Rect::zero(), - timer: Instant::now(), - animation: Vec::new(), - animations: Player::build_animations(tileset), - map_width: dimensions.0, - map_height: dimensions.1, - } - } - - fn build_animations(tileset: &Tileset) -> HashMap<AnimationState, Vec<(usize, Rect)>> { - let mut animations = HashMap::new(); - - let mut source = tileset.get_tile_by_entity_keyframe("player-top", 0); - source.h += tileset.get_tile_by_entity_keyframe("player-bottom", 0).h; - animations.insert(AnimationState::IdleLeft, vec![(1, source)]); - - let mut moving = tileset.get_tile_by_entity_keyframe("player-top", 1); - moving.h += tileset.get_tile_by_entity_keyframe("player-bottom", 1).h; - - animations.insert(AnimationState::MovingLeft, vec![(100, source), (100, moving)]); - animations.insert( - AnimationState::MovingUpLeft, - vec![(100, source), (100, moving)], - ); - animations.insert( - AnimationState::MovingDownLeft, - vec![(100, source), (100, moving)], - ); - - source = flip(source); - moving = flip(moving); - - animations.insert(AnimationState::IdleRight, vec![(1, source)]); - - animations.insert(AnimationState::MovingRight, vec![(100, source), (100, moving)]); - animations.insert( - AnimationState::MovingUpRight, - vec![(100, source), (100, moving)], +impl Operable for Player { + fn draw(&self, spritebatch: &mut SpriteBatch) { + spritebatch.add( + DrawParam::default() + .src(self.animation.source) + .dest(self.entity.position) + .scale(Vector2::new(constants::TILE_SCALE, constants::TILE_SCALE)), ); - animations.insert( - AnimationState::MovingDownRight, - vec![(100, source), (100, moving)], - ); - - animations } - pub fn draw(&self, spritebatch: &mut SpriteBatch) { - let draw_param = DrawParam::default() - .src(self.source) - .dest(self.position) - .scale(Vector2::new(constants::TILE_SCALE, constants::TILE_SCALE)); - - spritebatch.add(draw_param); + fn update(&mut self) { + self.move_position(); + self.animation.update(&self.entity.action); } +} - pub fn update(&mut self) { - self.move_position(); +impl Player { + pub fn new(tileset: &Tileset, dimensions: (f32, f32)) -> Player { + Player { + entity: Entity::new(Point2::new(0.0, 0.0), dimensions), + animation: Animation::new(tileset), + } + } - self.animation = self - .animations - .get(&self.state) - .cloned() - .unwrap_or_default(); - let (source, timer) = next_source(self.source, &self.animation, self.timer); - self.source = source; - self.timer = timer; + pub fn get_position(&self) -> Point2<f32> { + self.entity.position } fn move_position(&mut self) { - match self.state { - AnimationState::MovingUp => self.position.y -= constants::PLAYER_SPEED, - AnimationState::MovingUpLeft => { - self.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); - self.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); + match self.entity.action { + Action::MovingUp => self.entity.position.y -= constants::PLAYER_SPEED, + Action::MovingUpLeft => { + self.entity.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); + self.entity.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); } - AnimationState::MovingUpRight => { - self.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt(); - self.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); + Action::MovingUpRight => { + self.entity.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt(); + self.entity.position.y -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); } - AnimationState::MovingLeft => self.position.x -= constants::PLAYER_SPEED, - AnimationState::MovingDown => self.position.y += constants::PLAYER_SPEED, - AnimationState::MovingDownLeft => { - self.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); - self.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt(); + Action::MovingLeft => self.entity.position.x -= constants::PLAYER_SPEED, + Action::MovingDown => self.entity.position.y += constants::PLAYER_SPEED, + Action::MovingDownLeft => { + self.entity.position.x -= constants::PLAYER_SPEED / 2.0_f32.sqrt(); + self.entity.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt(); } - AnimationState::MovingDownRight => { - self.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt(); - self.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt(); + Action::MovingDownRight => { + self.entity.position.x += constants::PLAYER_SPEED / 2.0_f32.sqrt(); + self.entity.position.y += constants::PLAYER_SPEED / 2.0_f32.sqrt(); } - AnimationState::MovingRight => self.position.x += constants::PLAYER_SPEED, - AnimationState::IdleLeft | AnimationState::IdleRight => (), + Action::MovingRight => self.entity.position.x += constants::PLAYER_SPEED, + Action::IdleLeft | Action::IdleRight => (), } let pixel_width = constants::TILE_WIDTH * constants::TILE_SCALE; let pixel_height = constants::TILE_HEIGHT * constants::TILE_SCALE; - if self.position.x < 0.0 { - self.position.x = 0.0; - } else if self.position.x + pixel_height > self.map_width { - self.position.x = self.map_width - pixel_width; + if self.entity.position.x < 0.0 { + self.entity.position.x = 0.0; + } else if self.entity.position.x + pixel_height > self.entity.map_dimensions.0 { + self.entity.position.x = self.entity.map_dimensions.0 - pixel_width; } - if self.position.y < 0.0 { - self.position.y = 0.0; - } else if self.position.y + pixel_height > self.map_height { - self.position.y = self.map_height - pixel_height; + if self.entity.position.y < 0.0 { + self.entity.position.y = 0.0; + } else if self.entity.position.y + pixel_height > self.entity.map_dimensions.1 { + self.entity.position.y = self.entity.map_dimensions.1 - pixel_height; } } pub fn give_key_down(&mut self, keycode: KeyCode) { - let original_state = self.state.clone(); + let original_state = self.entity.action.clone(); - self.state = match keycode { + self.entity.action = match keycode { KeyCode::W => match original_state { - AnimationState::MovingLeft => AnimationState::MovingUpLeft, - AnimationState::MovingRight => AnimationState::MovingUpRight, - _ => AnimationState::MovingUp, + Action::MovingLeft => Action::MovingUpLeft, + Action::MovingRight => Action::MovingUpRight, + _ => Action::MovingUp, }, KeyCode::A => match original_state { - AnimationState::MovingUp => AnimationState::MovingUpLeft, - AnimationState::MovingDown => AnimationState::MovingDownLeft, - _ => AnimationState::MovingLeft, + Action::MovingUp => Action::MovingUpLeft, + Action::MovingDown => Action::MovingDownLeft, + _ => Action::MovingLeft, }, KeyCode::S => match original_state { - AnimationState::MovingLeft => AnimationState::MovingDownLeft, - AnimationState::MovingRight => AnimationState::MovingDownRight, - _ => AnimationState::MovingDown, + Action::MovingLeft => Action::MovingDownLeft, + Action::MovingRight => Action::MovingDownRight, + _ => Action::MovingDown, }, KeyCode::D => match original_state { - AnimationState::MovingUp => AnimationState::MovingUpRight, - AnimationState::MovingDown => AnimationState::MovingDownRight, - _ => AnimationState::MovingRight, + Action::MovingUp => Action::MovingUpRight, + Action::MovingDown => Action::MovingDownRight, + _ => Action::MovingRight, }, _ => original_state, } } pub fn give_key_up(&mut self, keycode: KeyCode) { - let original_state = self.state.clone(); + let original_state = self.entity.action.clone(); - self.state = match keycode { + self.entity.action = match keycode { KeyCode::W => match original_state { - AnimationState::MovingUpLeft => AnimationState::MovingLeft, - AnimationState::MovingUpRight => AnimationState::MovingRight, - _ => AnimationState::IdleLeft, + Action::MovingUpLeft => Action::MovingLeft, + Action::MovingUpRight => Action::MovingRight, + _ => Action::IdleLeft, }, KeyCode::A => match original_state { - AnimationState::MovingUpLeft => AnimationState::MovingUp, - AnimationState::MovingDownLeft => AnimationState::MovingDown, - _ => AnimationState::IdleLeft, + Action::MovingUpLeft => Action::MovingUp, + Action::MovingDownLeft => Action::MovingDown, + _ => Action::IdleLeft, }, KeyCode::S => match original_state { - AnimationState::MovingDownLeft => AnimationState::MovingLeft, - AnimationState::MovingDownRight => AnimationState::MovingRight, - _ => AnimationState::IdleRight, + Action::MovingDownLeft => Action::MovingLeft, + Action::MovingDownRight => Action::MovingRight, + _ => Action::IdleRight, }, KeyCode::D => match original_state { - AnimationState::MovingUpRight => AnimationState::MovingUp, - AnimationState::MovingDownRight => AnimationState::MovingDown, - _ => AnimationState::IdleRight, + Action::MovingUpRight => Action::MovingUp, + Action::MovingDownRight => Action::MovingDown, + _ => Action::IdleRight, }, _ => original_state, } } } - -#[derive(Clone, Hash, Eq, PartialEq)] -enum AnimationState { - IdleLeft, - IdleRight, - MovingUp, - MovingDown, - MovingLeft, - MovingRight, - MovingUpLeft, - MovingUpRight, - MovingDownLeft, - MovingDownRight, -} |