summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/layer.rs6
-rw-r--r--src/map.rs6
-rw-r--r--src/state.rs1
-rw-r--r--src/tile.rs18
-rw-r--r--src/tileset.rs27
-rw-r--r--src/xmlelements.rs8
6 files changed, 58 insertions, 8 deletions
diff --git a/src/layer.rs b/src/layer.rs
index efecd89..c9f32e8 100644
--- a/src/layer.rs
+++ b/src/layer.rs
@@ -23,6 +23,12 @@ impl Layer {
}
}
+ pub fn update(&mut self) {
+ for tile in self.tiles.iter_mut() {
+ tile.update();
+ }
+ }
+
pub fn draw(&self, spritebatch: &mut SpriteBatch) {
for tile in self.tiles.iter() {
tile.draw(spritebatch);
diff --git a/src/map.rs b/src/map.rs
index dc50116..ab436d1 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -53,6 +53,12 @@ impl Map {
}
}
+ pub fn update(&mut self) {
+ for layer in self.layers.iter_mut() {
+ layer.update();
+ }
+ }
+
pub fn get_dimensions(&self) -> (f32, f32) {
(
(constants::TILE_WIDTH * constants::TILE_SCALE) * self.width as f32,
diff --git a/src/state.rs b/src/state.rs
index b06d535..a981924 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -36,6 +36,7 @@ impl State {
impl EventHandler for State {
fn update(&mut self, context: &mut Context) -> GameResult {
+ self.map.update();
self.player.update(context);
self.camera.give_center(self.player.position);
Ok(())
diff --git a/src/tile.rs b/src/tile.rs
index dc9987c..198be10 100644
--- a/src/tile.rs
+++ b/src/tile.rs
@@ -1,5 +1,6 @@
use ggez::graphics::{spritebatch::SpriteBatch, DrawParam, Rect};
use ggez::nalgebra::{Point2, Vector2};
+use std::time::Instant;
use crate::constants;
use crate::math::convert_angle_to_rad;
@@ -7,7 +8,8 @@ use crate::tileset::Tileset;
pub struct Tile {
source: Rect,
- //animation: Option<Vec<(u32, Rect)>>,
+ animations: Option<Vec<(usize, Rect)>>,
+ timer: Instant,
destination: Point2<f32>,
rotation: f32,
}
@@ -49,7 +51,8 @@ impl Tile {
Tile {
source,
- //animation: None,
+ animations: tileset.get_animations(id),
+ timer: Instant::now(),
destination,
rotation,
}
@@ -62,6 +65,17 @@ impl Tile {
r
}
+ pub fn update(&mut self) {
+ if let Some(animations) = &self.animations {
+ let mut i = animations.iter().position(|a| a.1 == self.source).unwrap();
+ if self.timer.elapsed().as_millis() > animations[i].0 as u128 {
+ i = if i == animations.len() - 1 { 0 } else { i + 1 };
+ self.source = animations[i].1;
+ self.timer = Instant::now()
+ }
+ }
+ }
+
pub fn draw(&self, spritebatch: &mut SpriteBatch) {
let draw_param = DrawParam::default()
.src(self.source)
diff --git a/src/tileset.rs b/src/tileset.rs
index 44941df..548cde6 100644
--- a/src/tileset.rs
+++ b/src/tileset.rs
@@ -47,12 +47,12 @@ impl Tileset {
for tile_element in elements.get_elements("tile") {
let tile_id = XMLElements::get_attribute(&tile_element, "id")
.unwrap()
- .parse()
+ .parse::<usize>()
.unwrap();
let property_elements = elements.get_children(&tile_element, "property");
- properties.insert(tile_id, Property::new(property_elements));
+ properties.insert(tile_id + 1, Property::new(property_elements));
}
Tileset { tiles, properties }
@@ -61,4 +61,27 @@ impl Tileset {
pub fn get(&self, id: usize) -> Rect {
*self.tiles.get(&id).unwrap()
}
+
+ pub fn get_animations(&self, id: usize) -> Option<Vec<(usize, Rect)>> {
+ if let Some(property) = self.properties.get(&id) {
+ let entitys_properties: HashMap<usize, Property> = self
+ .properties
+ .clone()
+ .into_iter()
+ .filter(|(_, p)| p.entity == property.entity)
+ .collect();
+ Some(
+ entitys_properties
+ .iter()
+ .map(|(id, p)| (p.delay, self.get(*id)))
+ .collect(),
+ )
+ } else {
+ None
+ }
+ }
+
+ pub fn get_property(&self, id: usize) -> Option<&Property> {
+ self.properties.get(&id)
+ }
}
diff --git a/src/xmlelements.rs b/src/xmlelements.rs
index d05e9ff..ea880c8 100644
--- a/src/xmlelements.rs
+++ b/src/xmlelements.rs
@@ -5,11 +5,11 @@ use xml::reader::{
XmlEvent::{self, EndElement, StartElement},
};
-#[derive(Debug)]
+#[derive(Debug, Clone)]
pub struct Property {
- entity: String,
- keyframe: usize,
- delay: usize,
+ pub entity: String,
+ pub keyframe: usize,
+ pub delay: usize,
}
impl Property {