summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs93
1 files changed, 31 insertions, 62 deletions
diff --git a/src/main.rs b/src/main.rs
index 7ce26c9..1d4c606 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,96 +1,65 @@
use ggez::conf::Conf;
use ggez::event::{self, EventHandler};
use ggez::filesystem;
-use ggez::graphics::{self, spritebatch::SpriteBatch, DrawParam, FilterMode, Image};
+use ggez::graphics::{self, spritebatch::SpriteBatch, DrawParam, FilterMode, Image, Rect};
use ggez::nalgebra::{Point2, Vector2};
-use ggez::timer::delta;
use ggez::{Context, ContextBuilder, GameResult};
-use std::collections::HashMap;
-use std::io::Read;
-use std::time::Duration;
+use std::io::BufReader;
+use tiled::{parse, Map};
struct State {
- dt: Duration,
- spritebatches: HashMap<Tiles, SpriteBatch>,
- map: Vec<char>,
-}
-
-#[derive(Debug, PartialEq, Eq, Hash)]
-enum Tiles {
- Grass,
- Dirt,
+ spritebatch: SpriteBatch,
+ map: Map,
}
impl State {
fn new(context: &mut Context) -> GameResult<State> {
- let mut grass = Image::new(context, "/grass.png")?;
- grass.set_filter(FilterMode::Nearest);
-
- let mut dirt = Image::new(context, "/dirt.png")?;
- dirt.set_filter(FilterMode::Nearest);
+ let mut tileset = Image::new(context, "/tileset.png")?;
+ tileset.set_filter(FilterMode::Nearest);
- let mut spritebatches = HashMap::new();
- spritebatches.insert(Tiles::Grass, SpriteBatch::new(grass));
- spritebatches.insert(Tiles::Dirt, SpriteBatch::new(dirt));
-
- let mut map_str = String::new();
- filesystem::open(context, "/map.txt")
- .unwrap()
- .read_to_string(&mut map_str)
- .unwrap();
+ let reader = BufReader::new(filesystem::open(context, "/map.tmx")?);
Ok(State {
- dt: Duration::new(0, 0),
- spritebatches,
- map: map_str.replace("\n", "").chars().collect(),
+ spritebatch: SpriteBatch::new(tileset),
+ map: parse(reader).unwrap(),
})
}
}
const TILE_SIZE: f32 = 16.0;
-const TILE_SCALE: f32 = 4.0;
+const TILE_SCALE: f32 = 3.0;
impl EventHandler for State {
- fn update(&mut self, context: &mut Context) -> GameResult {
- self.dt = delta(context);
+ fn update(&mut self, _context: &mut Context) -> GameResult {
Ok(())
}
fn draw(&mut self, context: &mut Context) -> GameResult {
graphics::clear(context, graphics::BLACK);
- for x in 0..4 {
- for y in 0..4 {
- let draw_param = DrawParam::default()
- .dest(Point2::new(
- TILE_SIZE * TILE_SCALE * x as f32,
- TILE_SIZE * TILE_SCALE * y as f32,
- ))
- .scale(Vector2::new(TILE_SCALE, TILE_SCALE));
-
- let index = (x as usize) + (y as usize * 4);
- match self.map[index] {
- 'G' => {
- self.spritebatches
- .get_mut(&Tiles::Grass)
- .unwrap()
- .add(draw_param);
- }
- 'D' => {
- self.spritebatches
- .get_mut(&Tiles::Dirt)
- .unwrap()
- .add(draw_param);
- }
- _ => (),
+ for layer in self.map.layers.iter() {
+ for x in 0..self.map.width {
+ for y in 0..self.map.height {
+ let draw_param = DrawParam::default()
+ .dest(Point2::new(
+ TILE_SIZE * TILE_SCALE * x as f32,
+ TILE_SIZE * TILE_SCALE * y as f32,
+ ))
+ .scale(Vector2::new(TILE_SCALE, TILE_SCALE))
+ .src(match layer.tiles[y as usize][x as usize] {
+ 1 => Rect::new(0.0, 0.0, 1.0 / 3.0, 1.0),
+ 2 => Rect::new(1.0 / 3.0, 0.0, 2.0 / 3.0, 1.0),
+ 3 => Rect::new(2.0 / 3.0, 0.0, 1.0, 1.0),
+ _ => Rect::zero(),
+ });
+
+ self.spritebatch.add(draw_param);
}
}
}
- for (_, spritebatch) in self.spritebatches.iter_mut() {
- graphics::draw(context, spritebatch, DrawParam::default())?;
- spritebatch.clear();
- }
+ graphics::draw(context, &self.spritebatch, DrawParam::default())?;
+ self.spritebatch.clear();
graphics::present(context)?;
Ok(())