You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.0 KiB
96 lines
3.0 KiB
use std::{
|
|
process, thread,
|
|
time::{Duration, Instant},
|
|
};
|
|
|
|
use sdl2::{
|
|
event::{Event, WindowEvent},
|
|
keyboard::Keycode,
|
|
};
|
|
|
|
pub mod chunk;
|
|
|
|
use crate::{Game, InWorld, RenderAvailable, input::InputHandler, vector::Vector3};
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct Camera {
|
|
pub origin: Vector3<f32>,
|
|
pub rotation: Vector3<f32>,
|
|
}
|
|
|
|
impl Game<InWorld> {
|
|
/// The main gameloop, this will exit the program is the game is requested to close,
|
|
/// or return to the [`RenderAvailable`] state if the world is closed and we want to
|
|
/// return to a menu.
|
|
pub fn main_loop(mut self) -> Game<RenderAvailable> {
|
|
println!("Starting main loop");
|
|
let mut event_pump = self
|
|
.state
|
|
.sdl_context
|
|
.event_pump()
|
|
.expect("Failed to get event pump");
|
|
let mouse = self.state.sdl_context.mouse();
|
|
|
|
mouse.set_relative_mouse_mode(true);
|
|
|
|
let mut running = true;
|
|
while running {
|
|
let now = Instant::now();
|
|
for event in event_pump.poll_iter() {
|
|
match event {
|
|
// Setting running to false just returns to
|
|
// RenderAvailable state (and then main menu)
|
|
Event::Quit { .. } => process::exit(0),
|
|
Event::Window {
|
|
win_event: WindowEvent::Resized(w, h),
|
|
..
|
|
} => {
|
|
self.window_resize((w as u32, h as u32));
|
|
}
|
|
Event::KeyDown {
|
|
keycode: Some(keycode),
|
|
keymod,
|
|
repeat,
|
|
..
|
|
} => self.handle_keydown(keycode, keymod, repeat),
|
|
|
|
Event::KeyUp {
|
|
keycode: Some(keycode),
|
|
keymod,
|
|
repeat,
|
|
..
|
|
} => self.handle_keyup(keycode, keymod, repeat),
|
|
Event::MouseMotion {
|
|
mousestate,
|
|
x,
|
|
y,
|
|
xrel,
|
|
yrel,
|
|
..
|
|
} => self.handle_mouse_motion(mousestate, (x, y), (xrel, yrel)),
|
|
_ => {}
|
|
}
|
|
}
|
|
event_pump
|
|
.keyboard_state()
|
|
.pressed_scancodes()
|
|
.filter_map(Keycode::from_scancode)
|
|
.for_each(|k| self.handle_cont_key(k));
|
|
|
|
self.render_frame();
|
|
|
|
let elapsed = now.elapsed();
|
|
let delay = (1_000_000u128 / 60).saturating_sub(elapsed.as_micros());
|
|
thread::sleep(Duration::from_micros(delay as u64));
|
|
}
|
|
|
|
Game {
|
|
state: RenderAvailable {
|
|
sdl_context: self.state.sdl_context,
|
|
window: self.state.window,
|
|
ctx: self.state.ctx,
|
|
},
|
|
}
|
|
}
|
|
}
|