use crate::components::{self, Position, Sprite}; use crate::consts; use crate::game::MyGame; use ggez::{graphics, graphics::spritebatch::SpriteBatch, Context}; use specs::RunNow; /// The `Draw` system is parameterized by which phase we want to draw /// in. pub struct Draw<'t, Phase> { pub ctx: &'t mut Context, //pub sprites: &'t mut SpriteBatch, pub _phase: Phase, } impl<'a, 't, Phase: specs::Component> specs::System<'a> for Draw<'t, Phase> { type SystemData = ( specs::ReadStorage<'a, Position>, specs::ReadStorage<'a, Sprite>, specs::ReadStorage<'a, Phase>, specs::WriteExpect<'a, SpriteBatch>, ); fn run(&mut self, (positions, sprites, phase, mut batch): Self::SystemData) { use specs::Join; for (pos, spr, _) in (&positions, &sprites, &phase).join() { let param = graphics::DrawParam { src: spr.to_rect(), dest: pos.to_point(), scale: mint::Vector2 { x: consts::SCALE, y: consts::SCALE, }, ..Default::default() }; batch.add(param); } let basic: graphics::DrawParam = Default::default(); graphics::draw(self.ctx, &*batch, basic).unwrap(); batch.clear(); } } pub fn systems(game: &mut MyGame, ctx: &mut Context) -> ggez::GameResult<()> { graphics::clear(ctx, graphics::BLACK); Draw { ctx, _phase: components::Background, } .run_now(&game.world); Draw { ctx, _phase: components::Foreground, } .run_now(&game.world); Draw { ctx, _phase: components::Decoration, } .run_now(&game.world); graphics::present(ctx) }