Added a supercover line algorithm for better collision detection
[kaka/rust-sdl-test.git] / src / teststate.rs
index 2f8f240..0a66d82 100644 (file)
@@ -1,20 +1,23 @@
-use common::{Point, Intersection};
+use common::{Dimension, Point, Intersection};
 use core::app::{AppState, StateChange};
 use core::controller::ControllerManager;
+use core::level::Grid;
 use core::render::Renderer;
-use point; // defined in common, but loaded from main...
+use {point, dimen};
 use sdl2::event::Event;
 use sprites::SpriteManager;
 use time::{Duration, Instant};
 
 pub struct TestState {
     start: Instant,
+    mouse: Point<i32>,
 }
 
 impl TestState {
     pub fn new() -> TestState {
         TestState {
            start: Instant::now(),
+           mouse: point!(0, 0),
         }
     }
 
@@ -67,12 +70,56 @@ impl AppState for TestState {
        let y2 = ((self.start.elapsed().as_seconds_f64() + std::f64::consts::FRAC_PI_4).sin() * 60.0) as i32;
        self.draw_intersecting_lines(renderer, (100 + x, 100 + y), (150 + x, 150 + y), (100 + x2, 150 + y2), (150 + x2, 100 + y2));
        self.draw_intersecting_lines(renderer, (250 + x, 85 + y), (250 + x, 165 + y), (210 + x2, 125 + y2), (290 + x2, 125 + y2));
+
+       let grid = Grid {
+           size: dimen!(10, 10),
+           cell_size: dimen!(30, 30),
+           cells: vec!(vec!(false; 10); 10),
+       };
+
+       let offset = point!(200, 200);
+       let size = grid.cell_size;
+       for x in 0..grid.size.width {
+           for y in 0..grid.size.height {
+               let col = (32 + 32 * ((x + y) % 2)) as u8;
+               renderer.canvas().set_draw_color((col, col, col));
+               renderer.canvas().fill_rect(sdl2::rect::Rect::new(
+                   offset.x + x as i32 * size.width as i32,
+                   offset.y + y as i32 * size.height as i32,
+                   size.width as u32,
+                   size.height as u32)).unwrap();
+           }
+       }
+
+       let offsetf = point!(offset.x as f64, offset.y as f64);
+//     let p1 = point!(23.0, 16.0);
+       let p1 = point!(300.0 / 2.0, 300.0 / 2.0);
+       let p2 = {
+           //let p = point!(78.0*3.0, 54.0*3.0);
+           let p = self.mouse - offset;
+           point!(p.x as f64, p.y as f64)
+       };
+       for p in grid.grid_coordinates_on_line(p1, p2) {
+           renderer.canvas().set_draw_color((0, 96, 0));
+           renderer.canvas().fill_rect(sdl2::rect::Rect::new(
+               offset.x + p.x as i32 * size.width as i32,
+               offset.y + p.y as i32 * size.height as i32,
+               size.width as u32,
+               size.height as u32)).unwrap();
+       }
+       let p1 = p1 + offsetf;
+       let p2 = self.mouse;//p2 + offsetf;
+       renderer.draw_line((p1.x as i32, p1.y as i32), (p2.x as i32, p2.y as i32), (255, 255, 0));
     }
 
     fn leave(&mut self) {
     }
 
     fn handle_event(&mut self, _event: Event) -> Option<StateChange> {
+       match _event {
+           Event::MouseMotion { x, y, .. } => self.mouse = point!(x, y),
+           _ => {}
+       }
        None
     }
 }