diff options
author | tom barrett <spalf0@gmail.com> | 2019-06-15 10:00:12 -0500 |
---|---|---|
committer | tom barrett <spalf0@gmail.com> | 2019-06-15 10:00:12 -0500 |
commit | 0a485dd5f676bdf87b708c4c0ec44a3a263f25d0 (patch) | |
tree | cc7e4ca588e91fc7a661abaeaca87ca6dd003b36 /src/main.rs |
starting out
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7ce26c9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,111 @@ +use ggez::conf::Conf; +use ggez::event::{self, EventHandler}; +use ggez::filesystem; +use ggez::graphics::{self, spritebatch::SpriteBatch, DrawParam, FilterMode, Image}; +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; + +struct State { + dt: Duration, + spritebatches: HashMap<Tiles, SpriteBatch>, + map: Vec<char>, +} + +#[derive(Debug, PartialEq, Eq, Hash)] +enum Tiles { + Grass, + Dirt, +} + +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 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(); + + Ok(State { + dt: Duration::new(0, 0), + spritebatches, + map: map_str.replace("\n", "").chars().collect(), + }) + } +} + +const TILE_SIZE: f32 = 16.0; +const TILE_SCALE: f32 = 4.0; + +impl EventHandler for State { + fn update(&mut self, context: &mut Context) -> GameResult { + self.dt = delta(context); + 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 (_, spritebatch) in self.spritebatches.iter_mut() { + graphics::draw(context, spritebatch, DrawParam::default())?; + spritebatch.clear(); + } + + graphics::present(context)?; + Ok(()) + } +} + +fn main() -> GameResult { + let conf = Conf::new(); + + let (ref mut context, ref mut event_loop) = ContextBuilder::new("pax-romana", "tom barrett") + .conf(conf) + .add_resource_path("./resources") + .build()?; + + let state = &mut State::new(context)?; + + event::run(context, event_loop, state) +} |