diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs index 9455ac6..d82389f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ mod sprite_loader; mod vfx; use futures::executor; -use glam::IVec2; +use glam::{IVec2, Vec2}; use std::{collections::VecDeque, sync::Arc, time::Instant}; use winit::{ application::ApplicationHandler, @@ -20,7 +20,7 @@ use winit::{ use crate::{ camera::{Camera, CameraController}, - config::WINDOW_TITLE, + config::{CHUNK_SIZE, WINDOW_TITLE}, content::{ entities::{ entity_bullet_emitter::entity_bullet_emitter_def, entity_cube::entity_cube_def, @@ -36,7 +36,7 @@ use crate::{ }, proc_gen::TilesetWorldGenerator, renderer::RendererState, - sim::{rb_manager::DebugRenderMode, sim_manager::SimManager}, + sim::{entity::EntityId, rb_manager::DebugRenderMode, sim_manager::SimManager}, vfx::VfxManager, }; @@ -66,6 +66,8 @@ struct App { renderer_state: Option<RendererState>, // game + player: Option<EntityId>, + input_manager: InputManager, camera_controller: Option<CameraController>, vfx_manager: VfxManager, @@ -81,14 +83,31 @@ struct App { } impl App { + fn game_setup(&mut self) { + for cx in -5..5 { + for cy in -5..5 { + // skip the spawn chunk + if !(cx == 0 && cy == 0) { + let chunk = self.world_generator.generate_chunk(IVec2::new(cx, cy)); + self.sim_manager.cell_manager.upsert(cx, cy, chunk); + } + } + } + + self.player = Some(self.sim_manager.create_entity(entity_wizard_def( + // offset so the player is centred in the spawn chunk + Vec2::ZERO + Vec2::splat(CHUNK_SIZE as f32) / 2.0, + ))); + + self.camera_controller + .as_mut() + .unwrap() + .track_entity(self.player.unwrap()); + } + // called as often as possible // delta time is the real seconds elapsed since the last time this was called fn update(&mut self, delta_time: f32) { - // apply inputs - if let Some(camera_controller) = &mut self.camera_controller { - camera_controller.update(&self.input_manager, &self.sim_manager, delta_time); - } - // --TEST SPAWNING-- if self.input_manager.pressed(Input::Action1) { self.sim_manager.create_entity(entity_cube_def( @@ -125,6 +144,12 @@ impl App { &self.input_manager, delta_time, ); + + // update the camera after the physics so that if e.g., the player moved, we don't have jitter on the render + if let Some(camera_controller) = &mut self.camera_controller { + camera_controller.update(&self.input_manager, &self.sim_manager, delta_time); + } + self.input_manager.reset_for_frame(); } } @@ -144,10 +169,10 @@ impl Default for App { window: None, renderer_state: None, - input_manager: InputManager::new(), + player: None, + input_manager: InputManager::new(), camera_controller: None, - vfx_manager: VfxManager::new(), sim_manager: SimManager::new(), world_generator: TilesetWorldGenerator::new( @@ -186,6 +211,8 @@ impl ApplicationHandler for App { IVec2::new(size.width as i32, size.height as i32), camera::CameraControllerMode::Free, )); + + self.game_setup(); } fn window_event( |
