extern crate gate; use gate::{App, Audio}; use gate::app_info::AppInfo; use gate::input::*; use gate::renderer::{Renderer, Affine}; mod asset_id { include!(concat!(env!("OUT_DIR"), "/asset_id.rs")); } use asset_id::*; mod geometry; use geometry::*; mod entities; use entities::bug::Bug; struct BugBasherGame { bugs: Vec } impl App for BugBasherGame { fn start(&mut self, _audio: &mut Audio) { } fn advance(&mut self, seconds: f64, _audio: &mut Audio) -> bool { self.bugs.retain(|b| b.alive); for bug in self.bugs.iter_mut() { bug.advance(seconds); } true } fn input(&mut self, evt: InputEvent, _audio: &mut Audio) -> bool { match evt { InputEvent::MousePressed(MouseButton::Left, x, y) => { for bug in self.bugs.iter_mut() { bug.click(Vec2d { x, y }); } }, _ => {} } true } fn render(&mut self, renderer: &mut Renderer) { renderer.clear((255,255,255)); { let mut renderer = renderer.sprite_mode(); for bug in &self.bugs { renderer.draw( &Affine::translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation), SpriteId::Bug ); } } } } impl BugBasherGame { } fn main() { let info = AppInfo::with_app_height(1000.).title("Bug Basher").build(); gate::run(info, BugBasherGame { bugs: vec!( Bug::new(500., 200., 0.3), Bug::new(-200., -200., 1.5), Bug::new(-1000., 200., 0.), Bug::new(1200., 0., 0.3), Bug::new(-1300., 0., 1.5), Bug::new(0., 1100., 0.), Bug::new(0., -1500., 0.3), Bug::new(300., -1200., 1.5), ) }); }