use common::{Dimension, Point, Intersection}; use core::app::{AppState, StateChange}; use core::controller::ControllerManager; use core::level::Grid; use core::render::Renderer; use {point, dimen}; use sdl2::event::Event; use sprites::SpriteManager; use time::{Duration, Instant}; pub struct TestState { start: Instant, mouse: Point, } impl TestState { pub fn new() -> TestState { TestState { start: Instant::now(), mouse: point!(0, 0), } } fn draw_intersecting_lines(&self, renderer: &mut Renderer, p1: (i32, i32), p2: (i32, i32), p3: (i32, i32), p4: (i32, i32)) { let color = match Intersection::lines( point!(p1.0 as f64, p1.1 as f64), point!(p2.0 as f64, p2.1 as f64), point!(p3.0 as f64, p3.1 as f64), point!(p4.0 as f64, p4.1 as f64) ) { Intersection::Point(p) => { renderer.circle((p.x as i16, p.y as i16), 3, (255, 255, 0)); (0, 255, 0) } Intersection::None => (255, 0, 0) }; renderer.draw_line(p1, p2, color); renderer.draw_line(p3, p4, color); } } impl AppState for TestState { fn enter(&mut self, _ctrl_man: &ControllerManager) {} fn update(&mut self, _dt: Duration) -> Option { None } fn render(&mut self, renderer: &mut Renderer, _sprites: &SpriteManager) { // crossing self.draw_intersecting_lines(renderer, (0, 0), (20, 20), (20, 0), (0, 20)); self.draw_intersecting_lines(renderer, (30, 10), (50, 10), (40, 0), (40, 20)); // just touching self.draw_intersecting_lines(renderer, (70, 0), (70, 10), (60, 10), (80, 10)); self.draw_intersecting_lines(renderer, (90, 0), (100, 10), (90, 20), (110, 0)); self.draw_intersecting_lines(renderer, (120, 0), (140, 20), (120, 20), (130, 10)); self.draw_intersecting_lines(renderer, (170, 10), (160, 10), (160, 0), (160, 20)); // not touching self.draw_intersecting_lines(renderer, (190, 0), (210, 20), (195, 20), (200, 15)); let a = self.start.elapsed().as_seconds_f64().sin() * std::f64::consts::FRAC_PI_2; let (ax, ay) = ((a.cos() * 200.0) as i32, (a.sin() * 200.0) as i32); self.draw_intersecting_lines(renderer, (10, 400), (10 + ax, 400 + ay), (30, 200), (30, 600)); let x = (self.start.elapsed().as_seconds_f64().cos() * 60.0) as i32; let y = (self.start.elapsed().as_seconds_f64().sin() * 60.0) as i32; let x2 = ((self.start.elapsed().as_seconds_f64() + std::f64::consts::FRAC_PI_4).cos() * 60.0) as i32; 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), scale: dimen!(30.0, 30.0), cells: vec!(vec!(false; 10); 10), }; let offset = point!(200, 200); let size = grid.scale; 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 { match _event { Event::MouseMotion { x, y, .. } => self.mouse = point!(x, y), _ => {} } None } }