#[macro_use] extern crate specs_derive; use ggez::{Context, ContextBuilder, GameResult}; use ggez::event::{self, EventHandler}; use ggez::graphics; use specs::RunNow; use sdl2::keyboard as sdl; pub mod consts; pub mod components; pub mod res; pub mod sys; struct MyGame { world: specs::World, sprites: graphics::spritebatch::SpriteBatch, } impl EventHandler for MyGame { fn update(&mut self, _ctx: &mut Context) -> GameResult<()> { Ok(()) } fn draw(&mut self, ctx: &mut Context) -> GameResult<()> { ggez::graphics::set_background_color(ctx, ggez::graphics::BLACK); ggez::graphics::clear(ctx); sys::Draw { ctx, sprites: &mut self.sprites, _phase: components::Background, }.run_now(&self.world.res); sys::Draw { ctx, sprites: &mut self.sprites, _phase: components::Foreground, }.run_now(&self.world.res); sys::Draw { ctx, sprites: &mut self.sprites, _phase: components::Decoration, }.run_now(&self.world.res); ggez::graphics::draw( ctx, &self.sprites, ggez::nalgebra::Point2::new(0.0, 0.0), 0.0 )?; self.sprites.clear(); ggez::graphics::present(ctx); Ok(()) } fn key_down_event( &mut self, ctx: &mut Context, keycode: sdl::Keycode, _keymod: sdl::Mod, _repeat: bool, ) { if keycode == sdl::Keycode::Escape { ctx.quit().expect("Should never fail"); } sys::Move { keycode }.run_now(&self.world.res); } } fn main() -> Result<(), ggez::error::GameError> { let mut world = specs::World::new(); components::register(&mut world); res::world_from_file(&mut world, "assets/main.tmx"); // Make a Context and an EventLoop. let mut ctx = ContextBuilder::new("game", "me") .add_resource_path({ let base = std::env::var("CARGO_MANIFEST_DIR").unwrap(); let mut path = std::path::PathBuf::from(base); path.push("assets"); path }) .window_mode(ggez::conf::WindowMode { width: consts::WINDOW_WIDTH, height: consts::WINDOW_HEIGHT, ..Default::default() }) .build()?; let image = graphics::Image::new(&mut ctx, "/spritesheet.png")?; let mut sprites = graphics::spritebatch::SpriteBatch::new(image); sprites.set_filter(ggez::graphics::FilterMode::Nearest); let mut my_game = MyGame { world, sprites, }; event::run(&mut ctx, &mut my_game) }