summaryrefslogtreecommitdiff
path: root/src/entity.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/entity.rs')
-rw-r--r--src/entity.rs52
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>>),
+}