X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcore%2Fobject%2Fboll.rs;fp=src%2Fcore%2Fobject%2Fboll.rs;h=adae9895aa6c411f794f56ee52d90a4edebd04ca;hb=5d7eff9e9c0f585e9c4d57907f2e72003d39c757;hp=0000000000000000000000000000000000000000;hpb=09cd68feac9813b82f0c73e7c0429ddf0f719117;p=kaka%2Frust-sdl-test.git diff --git a/src/core/object/boll.rs b/src/core/object/boll.rs new file mode 100644 index 0000000..adae989 --- /dev/null +++ b/src/core/object/boll.rs @@ -0,0 +1,59 @@ +use core::level::{Level, IntersectResult::Intersection}; +use core::object::{Object, Objects, ObjectState}; +use core::render::Renderer; +use geometry::{Point, ToAngle}; +use sdl2::rect::Rect; +use sprites::SpriteManager; +use time::Duration; + +////////// BOLL //////////////////////////////////////////////////////////////// + +pub struct Boll { + pos: Point, + vel: Point, + bounces: u8, +} + +impl Boll { + pub fn new(pos: Point, vel: Point, bounces: u8) -> Self { + Boll { pos, vel, bounces } + } +} + +impl Object for Boll { + + fn update(&mut self, objects: &mut Objects, lvl: &Level, _dt: Duration) -> ObjectState { + self.vel += lvl.gravity; + self.pos += self.vel; + + if let Intersection(wall, pos) = lvl.intersect_walls(self.pos - self.vel, self.pos) { + if self.bounces == 0 { + return ObjectState::Dead + } + self.bounces -= 1; + let mut a = wall.normal().mirror(self.vel.to_angle()); // TODO interpolera normalen mellan närliggande väggdelar? bollarna studsar väldigt "kantigt" nu + self.pos = pos + Point::from(wall.normal()) * 0.1; // får bollen att inte åka igenom väggen av misstag p.g.a nedan slumpvinkel + self.vel = Point::from(a) * self.vel.length() * 0.35; + + // create another boll + use rand::distributions::{Distribution, Normal}; + let mut rng = rand::thread_rng(); + a += Normal::new(0.0, 0.1).sample(&mut rng).radians(); // TODO slumpen kan ge en vinkel som är under tangenten. vinkel-metoder på väggen istället kanske? + use rand::Rng; + objects.push(Box::new(Boll { + vel: Point::from(a) * Normal::new(1.0, 0.25).sample(&mut rng) * self.vel.length() * rng.gen_range(0.25, 1.0), + ..*self + })); + } + + ObjectState::Alive + } + + fn render(&self, renderer: &mut Renderer, _sprites: &SpriteManager) { + let block = _sprites.get("block"); + let size = 4 + self.bounces * 6; + renderer.blit(block, None, Rect::new(self.pos.x as i32 - size as i32 / 2, self.pos.y as i32 - size as i32 / 2, size as u32, size as u32)); + // renderer.canvas().set_draw_color((0, self.bounces * 100, 255)); + // renderer.canvas().draw_point((self.pos.x as i32, self.pos.y as i32)).unwrap(); + } +}