Compare commits
1 Commits
draft/0127
...
draft/0128
| Author | SHA1 | Date | |
|---|---|---|---|
| 57b6071008 |
@@ -4,18 +4,18 @@ use sdl2::gfx::primitives::DrawRenderer;
|
|||||||
use sdl2::pixels::Color;
|
use sdl2::pixels::Color;
|
||||||
use sdl2::{render::Canvas, video::Window, VideoSubsystem};
|
use sdl2::{render::Canvas, video::Window, VideoSubsystem};
|
||||||
|
|
||||||
use rand::prelude::*;
|
use crate::game_state::GameState;
|
||||||
|
|
||||||
pub struct Caster {
|
pub struct Caster {
|
||||||
projection_plane: Canvas<Window>,
|
projection_plane: Canvas<Window>,
|
||||||
title: &'static str,
|
_title: &'static str,
|
||||||
width: u32,
|
_width: u32,
|
||||||
height: u32,
|
_height: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Caster {
|
impl Caster {
|
||||||
pub fn init(
|
pub fn init(
|
||||||
video_subsystem: &VideoSubsystem,
|
video_subsystem: VideoSubsystem,
|
||||||
win_title: &'static str,
|
win_title: &'static str,
|
||||||
win_width: u32,
|
win_width: u32,
|
||||||
win_height: u32,
|
win_height: u32,
|
||||||
@@ -31,69 +31,23 @@ impl Caster {
|
|||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
projection_plane: canvas,
|
projection_plane: canvas,
|
||||||
title: win_title,
|
_title: win_title,
|
||||||
width: win_width,
|
_width: win_width,
|
||||||
height: win_height,
|
_height: win_height,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self) -> Result<(), Box<dyn Error>> {
|
pub fn update(&mut self, gamestate: &GameState) -> Result<(), Box<dyn Error>> {
|
||||||
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),
|
|
||||||
);
|
|
||||||
|
|
||||||
self.projection_plane.set_draw_color(Color::RGB(0, 0, 0));
|
self.projection_plane.set_draw_color(Color::RGB(0, 0, 0));
|
||||||
self.projection_plane.clear();
|
self.projection_plane.clear();
|
||||||
self.projection_plane
|
self.projection_plane.filled_circle(
|
||||||
.filled_circle(cur_x, cur_y, 10, ball_color)?;
|
gamestate.player().x,
|
||||||
|
gamestate.player().y,
|
||||||
|
10,
|
||||||
|
gamestate.p_color,
|
||||||
|
)?;
|
||||||
self.projection_plane.present();
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
20
vash_caster/src/event_handler.rs
Normal file
20
vash_caster/src/event_handler.rs
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
92
vash_caster/src/game_state.rs
Normal file
92
vash_caster/src/game_state.rs
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,8 +4,10 @@ extern crate sdl2;
|
|||||||
mod caster;
|
mod caster;
|
||||||
use caster::Caster;
|
use caster::Caster;
|
||||||
|
|
||||||
use sdl2::event::Event;
|
mod game_state;
|
||||||
use sdl2::keyboard::Keycode;
|
use game_state::GameState;
|
||||||
|
|
||||||
|
mod event_handler;
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
@@ -13,27 +15,23 @@ use std::time::Duration;
|
|||||||
pub fn run() -> Result<(), Box<dyn Error>> {
|
pub fn run() -> Result<(), Box<dyn Error>> {
|
||||||
let sdl_context = sdl2::init()?;
|
let sdl_context = sdl2::init()?;
|
||||||
let video_subsystem = sdl_context.video()?;
|
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()?;
|
let mut event_pump = sdl_context.event_pump()?;
|
||||||
|
|
||||||
'running: loop {
|
let mut gamestate = GameState::init();
|
||||||
for event in event_pump.poll_iter() {
|
let mut caster = Caster::init(video_subsystem, "Vash Caster", 800, 600)?;
|
||||||
match event {
|
|
||||||
Event::Quit { .. }
|
|
||||||
| Event::KeyDown {
|
|
||||||
keycode: Some(Keycode::Escape),
|
|
||||||
..
|
|
||||||
} => break 'running,
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 144));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
x: i16,
|
||||||
|
y: i16,
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user