diff --git a/vash_caster/src/caster.rs b/vash_caster/src/caster.rs index 8f1c36d..5d4b78c 100644 --- a/vash_caster/src/caster.rs +++ b/vash_caster/src/caster.rs @@ -6,6 +6,8 @@ use sdl2::{render::Canvas, video::Window, VideoSubsystem}; use rand::prelude::*; +use crate::game_state::GameState; + pub struct Caster { projection_plane: Canvas, title: &'static str, @@ -15,7 +17,7 @@ pub struct Caster { impl Caster { pub fn init( - video_subsystem: &VideoSubsystem, + video_subsystem: VideoSubsystem, win_title: &'static str, win_width: u32, win_height: u32, @@ -37,63 +39,17 @@ impl Caster { }) } - pub fn update(&mut self) -> Result<(), Box> { - let mut rng = rand::thread_rng(); - let mut d_x = rng.gen_range(1..=5); - let mut d_y = rng.gen_range(1..=5); - let mut cur_x = rng.gen_range(0..=800); - let mut cur_y = rng.gen_range(0..=600); - let mut ball_color = Color::RGB( - rng.gen_range(0..=255), - rng.gen_range(0..=255), - rng.gen_range(0..=255), - ); - + pub fn update(&mut self, gamestate: &GameState) -> Result<(), Box> { self.projection_plane.set_draw_color(Color::RGB(0, 0, 0)); self.projection_plane.clear(); - self.projection_plane - .filled_circle(cur_x, cur_y, 10, ball_color)?; + self.projection_plane.filled_circle( + gamestate.player().x, + gamestate.player().y, + 10, + gamestate.p_color, + )?; self.projection_plane.present(); - cur_x += d_x; - - if cur_x < 0 { - cur_x = 0; - ball_color = Color::RGB( - rng.gen_range(0..=255), - rng.gen_range(0..=255), - rng.gen_range(0..=255), - ); - d_x = rng.gen_range(1..=5); - } else if cur_x > 800 { - cur_x = 800; - ball_color = Color::RGB( - rng.gen_range(0..=255), - rng.gen_range(0..=255), - rng.gen_range(0..=255), - ); - d_x = rng.gen_range(-5..=-1); - } - - cur_y += d_y; - - if cur_y < 0 { - cur_y = 0; - ball_color = Color::RGB( - rng.gen_range(0..=255), - rng.gen_range(0..=255), - rng.gen_range(0..=255), - ); - d_y = rng.gen_range(1..=5); - } else if cur_y > 600 { - cur_y = 600; - ball_color = Color::RGB( - rng.gen_range(0..=255), - rng.gen_range(0..=255), - rng.gen_range(0..=255), - ); - d_y = rng.gen_range(-5..=-1); - } Ok(()) } } diff --git a/vash_caster/src/game_state.rs b/vash_caster/src/game_state.rs new file mode 100644 index 0000000..10736a4 --- /dev/null +++ b/vash_caster/src/game_state.rs @@ -0,0 +1,73 @@ +use sdl2::pixels::Color; + +use rand::prelude::*; + +use crate::Point; + +pub struct GameState { + player: Point, + pub p_dx: i16, + pub p_dy: i16, + pub p_rot: f32, + pub p_color: Color, + pub rng: ThreadRng, +} + +impl GameState { + pub fn init() -> Self { + Self { + player: Point { x: 400, y: 300 }, + p_dx: 1, + p_dy: 1, + p_rot: 90.0, + p_color: Color::RGB(255, 0, 0), + rng: rand::thread_rng(), + } + } + + pub fn update(&mut self) { + self.player.x += self.p_dx; + + if self.player.x < 0 { + self.player.x = 0; + self.p_color = Color::RGB( + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + ); + self.p_dx = self.rng.gen_range(1..=5); + } else if self.player.x > 800 { + self.player.x = 800; + self.p_color = Color::RGB( + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + ); + self.p_dx = self.rng.gen_range(-5..=-1); + } + + self.player.y += self.p_dy; + + if self.player.y < 0 { + self.player.y = 0; + self.p_color = Color::RGB( + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + ); + self.p_dy = self.rng.gen_range(1..=5); + } else if self.player.y > 600 { + self.player.y = 600; + self.p_color = Color::RGB( + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + self.rng.gen_range(0..=255), + ); + self.p_dy = self.rng.gen_range(-5..=-1); + } + } + + pub fn player(&self) -> &Point { + &self.player + } +} diff --git a/vash_caster/src/lib.rs b/vash_caster/src/lib.rs index 42fbe6e..66cadc1 100644 --- a/vash_caster/src/lib.rs +++ b/vash_caster/src/lib.rs @@ -4,6 +4,9 @@ extern crate sdl2; mod caster; use caster::Caster; +mod game_state; +use game_state::GameState; + use sdl2::event::Event; use sdl2::keyboard::Keycode; @@ -14,7 +17,9 @@ pub fn run() -> Result<(), Box> { let sdl_context = sdl2::init()?; let video_subsystem = sdl_context.video()?; - let mut caster = Caster::init(&video_subsystem, "Vash Caster", 800, 600)?; + let mut gamestate = GameState::init(); + + let mut caster = Caster::init(video_subsystem, "Vash Caster", 800, 600)?; let mut event_pump = sdl_context.event_pump()?; @@ -30,10 +35,17 @@ pub fn run() -> Result<(), Box> { } } - caster.update()?; + gamestate.update(); + + caster.update(&gamestate)?; ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 144)); } Ok(()) } + +struct Point { + x: i16, + y: i16, +}