From 011e2c74ea0909b06d6b09c0f068f7aff034944f Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Thu, 9 Aug 2018 18:13:14 +0200 Subject: Fixed positioning of things in new coordinate system Yay, camera! --- src/main.rs | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index db96656..060e681 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,17 +32,14 @@ struct BugBasherGame { game_over: bool, time_to_next_bug: f64, total_time: f64, - cursor_pos: Vec2d + camera: Affine } impl App for BugBasherGame { fn start(&mut self, _ctx: &mut AppContext) { } - fn advance(&mut self, seconds: f64, ctx: &mut AppContext) { - let (x, y) = ctx.cursor(); - self.cursor_pos = Vec2d::new(x, y); - + fn advance(&mut self, seconds: f64, _ctx: &mut AppContext) { if !self.game_over { self.bugs.retain(|b| b.alive); for bug in self.bugs.iter_mut() { @@ -87,7 +84,7 @@ impl App for BugBasherGame { } fn key_down(&mut self, key: KeyCode, ctx: &mut AppContext) { - let (x, y) = ctx.cursor(); + let (x, y) = self.camera.invert_translate().apply_f64(ctx.cursor()); match key { KeyCode::MouseLeft => { for bug in self.bugs.iter_mut().filter(|bug| bug.touches_point(Vec2d { x, y })) { @@ -107,24 +104,27 @@ impl App for BugBasherGame { fn render(&mut self, renderer: &mut Renderer, ctx: &AppContext) { let (app_width, app_height) = ctx.dims(); + let (cursor_x, cursor_y) = ctx.cursor(); + self.camera = Affine::translate(app_width/2., app_height/2.); + renderer.clear((255,255,255)); { let points_str = format!("{}", self.points); let lives_str = format!("{}", self.lives); - BugBasherGame::print_string(renderer, &points_str, Alignment::Left, - app_width / 2. + 50., app_height / 2. - 50.); - BugBasherGame::print_string(renderer, &lives_str, Alignment::Right, app_width / 2. - 50., app_height / 2. - 50.); + BugBasherGame::print_string(renderer, &points_str, Alignment::Left, 50., app_height - 50.); + BugBasherGame::print_string(renderer, &lives_str, Alignment::Right, app_width - 50., app_height - 50.); } { let mut renderer = renderer.sprite_mode(); renderer.draw( - &Affine::translate(self.home.pos.x, self.home.pos.y), + &self.camera.post_translate(self.home.pos.x, self.home.pos.y), self.home.sprite ); for bug in &self.bugs { let affine = if bug.rotation <= FRAC_PI_2 && bug.rotation >= -FRAC_PI_2 { - Affine::translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation) + self.camera.post_translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation) } else { - Affine::translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation).pre_scale_axes(1., -1.) + self.camera.post_translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation).pre_scale_axes(1., -1.) }; renderer.draw( @@ -138,20 +138,20 @@ impl App for BugBasherGame { { let mut renderer = renderer.sprite_mode(); renderer.draw( - &Affine::translate(0.,0.), + &self.camera, SpriteId::Gameover ); } { let points_str = format!("{}", self.points); - BugBasherGame::print_string(renderer, &points_str, Alignment::Center, 0., -25.); + BugBasherGame::print_string(renderer, &points_str, Alignment::Center, app_width/2., app_height/2.-25.); } } { let mut renderer = renderer.sprite_mode(); renderer.draw( - &Affine::translate(self.cursor_pos.x, self.cursor_pos.y), + &Affine::translate(cursor_x, cursor_y), SpriteId::Cursor ); } @@ -175,7 +175,7 @@ impl BugBasherGame { game_over: true, time_to_next_bug: 0., total_time: 0., - cursor_pos: Vec2d::new(0.,0.) + camera: Affine::id() }; game.reset(); game @@ -200,7 +200,7 @@ impl BugBasherGame { let mut renderer = renderer.sprite_mode(); for (i, c) in string.chars().enumerate() { - let affine = Affine::translate(i as f64 * letter_spacing - left, -y); + let affine = Affine::translate(left + i as f64 * letter_spacing, y); let tile = match c { '-' => SpriteId::NumberFontR0C0, '0' => SpriteId::NumberFontR0C1, @@ -222,7 +222,6 @@ impl BugBasherGame { fn main() { let info = AppInfo::with_max_dims(2000., 1000.) - .min_dims(500., 1000.) .tile_width(16) .title("Nap Attack"); gate::run(info, BugBasherGame::new()); -- cgit v1.2.3