Replaced Degrees and Radians with a single Angle type
[kaka/rust-sdl-test.git] / src / boll.rs
index f936fca..5d09563 100644 (file)
@@ -1,20 +1,18 @@
-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 common::Point;
+use sdl2::gfx::primitives::DrawRenderer;
 use {SCREEN_HEIGHT, SCREEN_WIDTH};
-use common::Point2D;
 
 pub trait Boll {
     fn update(&mut self);
-    fn draw(&mut self, canvas: &mut Canvas<Window>, size: u32);
+    fn draw(&self, renderer: &mut Renderer, size: u32);
 }
 
 pub struct SquareBoll {
-    pub pos: Point2D<f64>,
-    pub vel: Point2D<f64>,
+    pub pos: Point<f64>,
+    pub vel: Point<f64>,
 }
 
 impl Boll for SquareBoll {
@@ -40,14 +38,46 @@ impl Boll for SquareBoll {
         }
     }
 
-    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: Point<f64>, vel: Point<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();
     }
 }