From 3b2017b7f4e7d1c932b430fa515286a9ceaf1a92 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Mon, 2 Apr 2018 15:36:01 +0200 Subject: [PATCH] Added hitboxes and something for the bugs to run into --- src/entities/bug.rs | 15 +++++---- src/entities/home.rs | 27 +++++++++++++++ src/entities/mod.rs | 1 + src/hitbox.rs | 14 ++++++++ src/main.rs | 19 +++++++++-- src_assets/sprites/Home.png | Bin 0 -> 7749 bytes src_assets/sprites/Home.svg | 79 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 src/entities/home.rs create mode 100644 src/hitbox.rs create mode 100644 src_assets/sprites/Home.png create mode 100644 src_assets/sprites/Home.svg diff --git a/src/entities/bug.rs b/src/entities/bug.rs index 424e195..482e5c4 100644 --- a/src/entities/bug.rs +++ b/src/entities/bug.rs @@ -1,5 +1,7 @@ use geometry::*; +use hitbox::*; +#[derive(Debug, Clone)] pub struct Bug { pub pos: Vec2d, pub rotation: f64, @@ -29,14 +31,13 @@ impl Bug { }; self.pos = self.pos + delta_pos; } +} - pub fn click(&mut self, point: Vec2d) { - if self.touches(point) { - self.alive = false; - } +impl CircleHitbox for Bug { + fn pos(&self) -> Vec2d { + self.pos } - - fn touches(&self, point: Vec2d) -> bool { - self.pos.distance(point) <= 75. // Some better hit box modelling might be nice? + fn radius(&self) -> f64 { + 75. } } diff --git a/src/entities/home.rs b/src/entities/home.rs new file mode 100644 index 0000000..6f7f53d --- /dev/null +++ b/src/entities/home.rs @@ -0,0 +1,27 @@ +use geometry::*; +use hitbox::*; + +#[derive(Debug, Clone)] +pub struct Home { + pub pos: Vec2d +} + +impl Home { + pub fn new(x: f64, y: f64) -> Home { + Home { + pos: Vec2d { + x: x, + y: y + } + } + } +} + +impl CircleHitbox for Home { + fn pos(&self) -> Vec2d { + self.pos + } + fn radius(&self) -> f64 { + 100. + } +} diff --git a/src/entities/mod.rs b/src/entities/mod.rs index 0f4281c..90b4a11 100644 --- a/src/entities/mod.rs +++ b/src/entities/mod.rs @@ -1 +1,2 @@ pub mod bug; +pub mod home; diff --git a/src/hitbox.rs b/src/hitbox.rs new file mode 100644 index 0000000..df87b68 --- /dev/null +++ b/src/hitbox.rs @@ -0,0 +1,14 @@ +use geometry::*; + +pub trait CircleHitbox { + fn pos(&self) -> Vec2d; + fn radius(&self) -> f64; + + fn touches_point(&self, point: Vec2d) -> bool { + self.pos().distance(point) <= self.radius() + } + + fn touches_circle(&self, other: &CircleHitbox) -> bool { + self.pos().distance(other.pos()) <= self.radius() + other.radius() + } +} diff --git a/src/main.rs b/src/main.rs index ff8b64f..9ba7474 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,11 +11,16 @@ use asset_id::*; mod geometry; use geometry::*; +mod hitbox; +use hitbox::*; + mod entities; use entities::bug::Bug; +use entities::home::Home; struct BugBasherGame { bugs: Vec, + home: Home, points: i64 } @@ -27,6 +32,10 @@ impl App for BugBasherGame { self.bugs.retain(|b| b.alive); for bug in self.bugs.iter_mut() { bug.advance(seconds); + if self.home.touches_circle(bug) { + bug.alive = false; + self.points -= 1; + } } true @@ -35,8 +44,9 @@ impl App for BugBasherGame { 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 }); + for bug in self.bugs.iter_mut().filter(|bug| bug.touches_point(Vec2d { x, y })) { + bug.alive = false; + self.points += 1; } }, _ => {} @@ -73,6 +83,10 @@ impl App for BugBasherGame { } { let mut renderer = renderer.sprite_mode(); + renderer.draw( + &Affine::translate(self.home.pos.x, self.home.pos.y), + SpriteId::Home + ); for bug in &self.bugs { renderer.draw( &Affine::translate(bug.pos.x, bug.pos.y).pre_rotate(bug.rotation), @@ -89,6 +103,7 @@ impl BugBasherGame { fn main() { let info = AppInfo::with_app_height(1000.).title("Bug Basher").build(); gate::run(info, BugBasherGame { + home: Home::new(0., 0.), bugs: vec!( Bug::new(500., 200., 0.3), Bug::new(-200., -200., 1.5), diff --git a/src_assets/sprites/Home.png b/src_assets/sprites/Home.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4c2c7cddd983d6a82ad63747f690673e18ecc0 GIT binary patch literal 7749 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 LNkvXXu0mjflx~^M literal 0 HcmV?d00001 diff --git a/src_assets/sprites/Home.svg b/src_assets/sprites/Home.svg new file mode 100644 index 0000000..e26e9ad --- /dev/null +++ b/src_assets/sprites/Home.svg @@ -0,0 +1,79 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + -- 2.9.5