82 lines
2.3 KiB
Rust
82 lines
2.3 KiB
Rust
mod camera_controller;
|
|
mod player;
|
|
pub mod world;
|
|
use std::time::Instant;
|
|
use crate::renderer::content_view::ContentView;
|
|
use cgmath::{SquareMatrix, Point3, InnerSpace};
|
|
use winit::event::Event;
|
|
use crate::renderer::{camera::CameraTransform};
|
|
use player::Player;
|
|
use world::World;
|
|
|
|
|
|
pub enum GameState {
|
|
Paused,
|
|
Running
|
|
}
|
|
|
|
pub struct Game {
|
|
player: Player,
|
|
world: World
|
|
}
|
|
|
|
impl Game {
|
|
pub fn new(content: &mut dyn ContentView) -> Self {
|
|
let mut app = Self {
|
|
player: Player::new(),
|
|
world: World::new("default".to_string())
|
|
};
|
|
|
|
// Try to load world from file
|
|
let timer = Instant::now();
|
|
if app.world.load() {
|
|
for (pos, block) in app.world.all_blocks() {
|
|
content.write(&pos, block);
|
|
}
|
|
println!("Loaded in {}", timer.elapsed().as_secs_f32());
|
|
}
|
|
// Generate new world
|
|
else {
|
|
let timer = Instant::now();
|
|
for x in 0..32 {
|
|
for z in 0..32 {
|
|
let pos = &Point3{x,y:0,z};
|
|
let block = app.world.gen_block(pos);
|
|
content.write(pos, block);
|
|
}
|
|
}
|
|
println!("Generated in {}", timer.elapsed().as_secs_f32());
|
|
|
|
let timer = Instant::now();
|
|
app.world.save();
|
|
println!("Saved in {}", timer.elapsed().as_secs_f32());
|
|
}
|
|
|
|
|
|
println!("App initialized");
|
|
app
|
|
}
|
|
|
|
pub fn input(&mut self, event: &Event<()>) {
|
|
// Update camera controller
|
|
self.player.camera_controller.handle_input(event);
|
|
}
|
|
|
|
pub fn update_state(&mut self, requested_state: GameState) -> GameState {
|
|
match requested_state {
|
|
GameState::Paused => {
|
|
self.player.camera_controller.set_enabled(false);
|
|
}
|
|
GameState::Running => {
|
|
self.player.camera_controller.set_enabled(true);
|
|
}
|
|
};
|
|
|
|
// Currently we are not preventing any state changes, just return requested state
|
|
requested_state
|
|
}
|
|
|
|
pub fn update_camera(&mut self, delta: f32, camera_transform: &mut dyn CameraTransform) {
|
|
self.player.camera_controller.update(delta, camera_transform);
|
|
}
|
|
} |