Refactored level generation + fixed bug with wall finding
[kaka/rust-sdl-test.git] / src / boll.rs
index b273f1d..abf6c87 100644 (file)
@@ -1,19 +1,22 @@
-use sdl2::pixels::Color;
-use sdl2::rect::Point;
+use core::render::Renderer;
 use sdl2::rect::Rect;
-use sdl2::render::Canvas;
-use sdl2::video::Window;
 
-use {SCREEN_HEIGHT, SCREEN_WIDTH};
 use common::Point2D;
+use sdl2::gfx::primitives::DrawRenderer;
+use {SCREEN_HEIGHT, SCREEN_WIDTH};
+
+pub trait Boll {
+    fn update(&mut self);
+    fn draw(&self, renderer: &mut Renderer, size: u32);
+}
 
-pub struct Boll {
+pub struct SquareBoll {
     pub pos: Point2D<f64>,
     pub vel: Point2D<f64>,
 }
 
-impl Boll {
-    pub fn update(&mut self) {
+impl Boll for SquareBoll {
+    fn update(&mut self) {
         self.vel.y += 0.1;
         self.pos += self.vel;
 
@@ -35,14 +38,46 @@ impl Boll {
         }
     }
 
-    pub fn draw(&mut self,canvas: &mut Canvas<Window>, size: u32) {
-        canvas.set_draw_color(Color::RGBA(
+    fn draw(&self, renderer: &mut Renderer, size: u32) {
+        renderer.canvas().set_draw_color((
             255 - std::cmp::min(255, (self.vel.length() * 25.0) as u8),
             (255.0 * (self.pos.x / SCREEN_WIDTH as f64)) as u8,
-            (255.0 * (self.pos.y / SCREEN_HEIGHT as f64)) as u8, 128
+            (255.0 * (self.pos.y / SCREEN_HEIGHT as f64)) as u8,
+            128,
         ));
         let mut r = Rect::new(0, 0, size, size);
-        r.center_on(Point::new(self.pos.x as i32, self.pos.y as i32));
-        canvas.fill_rect(r).unwrap();
+        r.center_on((self.pos.x as i32, self.pos.y as i32));
+        renderer.canvas().fill_rect(r).unwrap();
+    }
+}
+
+pub struct CircleBoll {
+    pub boll: SquareBoll,
+}
+
+impl CircleBoll {
+    pub fn new(pos: Point2D<f64>, vel: Point2D<f64>) -> CircleBoll {
+        CircleBoll {
+            boll: SquareBoll { pos, vel },
+        }
+    }
+}
+
+impl Boll for CircleBoll {
+    fn update(&mut self) {
+        self.boll.update();
+    }
+
+    fn draw(&self, renderer: &mut Renderer, size: u32) {
+        let val = 255 - std::cmp::min(255, (self.boll.vel.length() * 20.0) as u8);
+        renderer
+           .canvas()
+            .filled_circle(
+                self.boll.pos.x as i16,
+                self.boll.pos.y as i16,
+                size as i16,
+                (val, val, val, 128),
+            )
+            .unwrap();
     }
 }