diff --git a/vash_caster/src/caster.rs b/vash_caster/src/caster.rs index 8f1c36d..bb37bcb 100644 --- a/vash_caster/src/caster.rs +++ b/vash_caster/src/caster.rs @@ -4,18 +4,18 @@ use sdl2::gfx::primitives::DrawRenderer; use sdl2::pixels::Color; use sdl2::{render::Canvas, video::Window, VideoSubsystem}; -use rand::prelude::*; +use crate::game_state::GameState; pub struct Caster { projection_plane: Canvas, - title: &'static str, - width: u32, - height: u32, + _title: &'static str, + _width: u32, + _height: u32, } impl Caster { pub fn init( - video_subsystem: &VideoSubsystem, + video_subsystem: VideoSubsystem, win_title: &'static str, win_width: u32, win_height: u32, @@ -31,69 +31,23 @@ impl Caster { Ok(Self { projection_plane: canvas, - title: win_title, - width: win_width, - height: win_height, + _title: win_title, + _width: win_width, + _height: win_height, }) } - 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/event_handler.rs b/vash_caster/src/event_handler.rs new file mode 100644 index 0000000..007e45f --- /dev/null +++ b/vash_caster/src/event_handler.rs @@ -0,0 +1,20 @@ +use sdl2::event::Event; +use sdl2::keyboard::Keycode; +use sdl2::EventPump; + +use crate::game_state::GameState; + +pub fn process_events(event_pump: &mut EventPump, game_state: &mut GameState) { + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } + | Event::KeyDown { + keycode: Some(Keycode::Escape), + .. + } => { + game_state.set_running(false); + } + _ => {} + } + } +} diff --git a/vash_caster/src/game_state.rs b/vash_caster/src/game_state.rs new file mode 100644 index 0000000..5495225 --- /dev/null +++ b/vash_caster/src/game_state.rs @@ -0,0 +1,92 @@ +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, + running: bool, + pub rng: ThreadRng, +} + +impl GameState { + pub fn init() -> Self { + let mut new_rng = rand::thread_rng(); + + Self { + player: Point { + x: new_rng.gen_range(0..800), + y: new_rng.gen_range(0..600), + }, + p_dx: new_rng.gen_range(1..=5), + p_dy: new_rng.gen_range(1..=5), + p_rot: 90.0, + p_color: Color::RGB( + new_rng.gen_range(0..=255), + new_rng.gen_range(0..=255), + new_rng.gen_range(0..=255), + ), + running: true, + rng: new_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 + } + + pub fn running(&self) -> bool { + self.running + } + + pub fn set_running(&mut self, is_running: bool) { + self.running = is_running; + } +} diff --git a/vash_caster/src/lib.rs b/vash_caster/src/lib.rs index 42fbe6e..41e3149 100644 --- a/vash_caster/src/lib.rs +++ b/vash_caster/src/lib.rs @@ -4,8 +4,10 @@ extern crate sdl2; mod caster; use caster::Caster; -use sdl2::event::Event; -use sdl2::keyboard::Keycode; +mod game_state; +use game_state::GameState; + +mod event_handler; use std::error::Error; use std::time::Duration; @@ -13,27 +15,23 @@ use std::time::Duration; 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 event_pump = sdl_context.event_pump()?; - 'running: loop { - for event in event_pump.poll_iter() { - match event { - Event::Quit { .. } - | Event::KeyDown { - keycode: Some(Keycode::Escape), - .. - } => break 'running, - _ => {} - } - } + let mut gamestate = GameState::init(); + let mut caster = Caster::init(video_subsystem, "Vash Caster", 800, 600)?; - caster.update()?; + while gamestate.running() { + event_handler::process_events(&mut event_pump, &mut gamestate); + gamestate.update(); + caster.update(&gamestate)?; ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 144)); } Ok(()) } + +struct Point { + x: i16, + y: i16, +}