From 1d859a3e7dde39aa08a4837d8f8a48f53f782678 Mon Sep 17 00:00:00 2001 From: Thomas Gideon Date: Thu, 13 Jul 2017 18:53:30 -0400 Subject: [PATCH] Make it possible to eat star candy --- Cargo.toml | 2 ++ src/lib.rs | 33 ++++++++++++++++++++------------- src/mobs/hero.rs | 21 ++++++++++++++++++++- src/mobs/star.rs | 20 +++++++++++++++++++- 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index daf600f..5888c44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,5 @@ piston2d-graphics = "0.21.1" find_folder = "0.3.0" uuid = "0.1.17" rand = "0.3" +nalgebra = "0.12.0" +ncollide = "0.12.0" diff --git a/src/lib.rs b/src/lib.rs index f241e2a..c83b1fc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ extern crate ai_behavior; extern crate find_folder; extern crate gfx_device_gl; extern crate graphics; +extern crate nalgebra; +extern crate ncollide; extern crate piston_window; extern crate rand; extern crate sprite; @@ -20,6 +22,7 @@ pub struct Game { scene: Scene>, player: Hero, star: Star, + diag: bool, } impl Game { @@ -31,12 +34,18 @@ impl Game { scene: scene, player: player, star: star, + diag: false, } } pub fn on_update(&mut self, e: &Input, upd: UpdateArgs, w: &PistonWindow) { self.scene.event(e); + if !self.star.destroyed && self.player.collides(&self.star) { + self.star.destroy(&mut self.scene, upd.dt); + self.player.grow(&mut self.scene, upd.dt); + } + self.star.mov(w, &mut self.scene, upd.dt); self.player.mov(w, &mut self.scene, upd.dt); @@ -63,19 +72,14 @@ impl Game { image.draw(&bg, &Default::default(), c.transform.trans(x, y).zoom(0.1), g); } - text::Text::new_color([0.0, 1.0, 0.0, 1.0], 10).draw( - &format!("{} x: {}, y: {}", self.player.sprite_id, self.player.x.trunc(), self.player.y.trunc()), - &mut glyphs, - &c.draw_state, - c.transform.trans(10.0, 100.0), g - ); - - text::Text::new_color([0.0, 1.0, 0.0, 1.0], 10).draw( - &format!("{} x: {}, y: {}", self.star.sprite_id, self.star.x.trunc(), self.star.y.trunc()), - &mut glyphs, - &c.draw_state, - c.transform.trans(10.0, 110.0), g - ); + if self.diag { + text::Text::new_color([0.0, 1.0, 0.0, 1.0], 10).draw( + &format!("{} {}", self.player.diag(), self.star.diag()), + &mut glyphs, + &c.draw_state, + c.transform.trans(10.0, 10.0), g + ); + } self.scene.draw(c.transform, g); }); @@ -115,6 +119,9 @@ impl Game { Button::Keyboard(Key::Right) => { self.player.dir = (0.0, self.player.dir.1); } + Button::Keyboard(Key::H) => { + self.diag = !self.diag; + } _ => {} } } diff --git a/src/mobs/hero.rs b/src/mobs/hero.rs index 77ffc41..4bcc6e7 100644 --- a/src/mobs/hero.rs +++ b/src/mobs/hero.rs @@ -2,10 +2,13 @@ use ai_behavior::Action; use find_folder; use gfx_device_gl::Resources; use piston_window::*; +use ncollide::shape::Cuboid2; +use ncollide::query::{proximity, Proximity}; +use nalgebra::{self, Isometry2, Vector2}; use sprite::*; use uuid::Uuid; use std::rc::Rc; -use mobs::wrap; +use mobs::{wrap, Star}; pub struct Hero { pub sprite_id: Uuid, @@ -14,6 +17,7 @@ pub struct Hero { pub y: f64, w: f64, h: f64, + collider: Cuboid2, } impl Hero { @@ -37,6 +41,7 @@ impl Hero { h: bounds[3], dir: (0.0, 0.0), sprite_id: sprite_id, + collider: Cuboid2::new(Vector2::new(bounds[2], bounds[3])), } } @@ -58,4 +63,18 @@ impl Hero { let mov_y = self.dir.1 * 2.0; scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(dt * 0.75, mov_x, mov_y))))); } + + pub fn grow(&mut self, scene: &mut Scene>, dt: f64) { + scene.run(self.sprite_id, &Action(Ease(EaseFunction::ElasticInOut, Box::new(ScaleBy(dt * 5.0, 0.3, 0.3))))); + } + + pub fn collides(&mut self, star: &Star) -> bool { + let star_pos = Isometry2::new(Vector2::new(star.x, star.y), nalgebra::zero()); + let pos = Isometry2::new(Vector2::new(self.x, self.y), nalgebra::zero()); + proximity(&star_pos, &star.collider, &pos, &self.collider, 0.0) == Proximity::Intersecting + } + + pub fn diag(&self) -> String { + format!("{}: x {} / y {}", self.sprite_id, self.x.trunc(), self.y.trunc()) + } } diff --git a/src/mobs/star.rs b/src/mobs/star.rs index 4bf62f1..4621542 100644 --- a/src/mobs/star.rs +++ b/src/mobs/star.rs @@ -2,13 +2,14 @@ use ai_behavior::Action; use find_folder; use gfx_device_gl::Resources; use piston_window::*; +use ncollide::shape::Cuboid2; +use nalgebra::Vector2; use sprite::*; use uuid::Uuid; use rand; use std::rc::Rc; use super::wrap; - pub struct Star { pub sprite_id: Uuid, pub x: f64, @@ -16,6 +17,8 @@ pub struct Star { w: f64, h: f64, dir: u32, + pub collider: Cuboid2, + pub destroyed: bool, } impl Star { @@ -40,10 +43,15 @@ impl Star { h: bounds[3], sprite_id: sprite_id, dir: rand_dir(), + collider: Cuboid2::new(Vector2::new(bounds[2], bounds[3])), + destroyed: false, } } pub fn mov(&mut self, w: &PistonWindow, scene: &mut Scene>, dt: f64) { + if self.destroyed { + return; + } if let Some(sprite) = scene.child(self.sprite_id) { let (sprite_x, sprite_y) = sprite.get_position(); self.x = sprite_x; @@ -63,6 +71,16 @@ impl Star { let mov_y = 2.0 * dir.1; scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(dt * 0.75, mov_x, mov_y))))); } + + pub fn destroy(&mut self, scene: &mut Scene>, dt: f64) { + scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(FadeOut(dt * 0.75))))); + self.destroyed = true; + } + + + pub fn diag(&self) -> String { + format!("{}: x {} / y {}", self.sprite_id, self.x.trunc(), self.y.trunc()) + } } fn rand_dir() -> u32 {