diff options
Diffstat (limited to 'src/entity.rs')
-rw-r--r-- | src/entity.rs | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/entity.rs b/src/entity.rs index bd29a84..1c0aa35 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -1,12 +1,15 @@ use ggez::graphics::{spritebatch::SpriteBatch, DrawParam, Rect}; -use ggez::nalgebra::{Point2, Vector2}; +use ggez::nalgebra::{distance, Point2, Vector2}; +use std::time::Instant; use crate::constants; use crate::map::Map; +use crate::math::random_nearby_point; use crate::tileset::Tileset; #[derive(Clone)] pub struct Entity { + behavior: Behavior, position: Point2<f32>, source: Rect, spawn: Point2<f32>, @@ -18,12 +21,49 @@ impl Entity { source.h += tileset.get_tile_by_entity_keyframe("player-bottom", 0).h; Entity { - position: spawn, - source, spawn, + source, + position: spawn, + behavior: Behavior::Wandering(None), + } + } + + pub fn update(&mut self) { + match self.behavior { + Behavior::Wandering(destination) => self.wandering(destination), + Behavior::Waiting(time) => (), } } + pub fn wandering(&mut self, destination: Option<Point2<f32>>) { + match destination { + Some(destination) => { + if distance(&self.position, &destination) < constants::GOAL_DISTANCE { + self.behavior = Behavior::Waiting(Instant::now()) + } else { + if self.position.x < destination.x { + self.position.x += constants::ENTITY_SPEED; + } else { + self.position.x -= constants::ENTITY_SPEED; + } + if self.position.y < destination.y { + self.position.y += constants::ENTITY_SPEED; + } else { + self.position.y -= constants::ENTITY_SPEED; + } + } + } + None => { + self.behavior = Behavior::Wandering(Some(random_nearby_point( + self.spawn, + constants::WANDER_DISTANCE, + ))) + } + } + } + + pub fn waiting(&mut self) {} + pub fn draw(&self, spritebatch: &mut SpriteBatch) { let draw_param = DrawParam::default() .src(self.source) @@ -43,3 +83,9 @@ impl Entity { entities } } + +#[derive(Clone)] +enum Behavior { + Waiting(Instant), + Wandering(Option<Point2<f32>>), +} |