summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content/entities/entity_wizard.rs3
-rw-r--r--src/main.rs47
2 files changed, 39 insertions, 11 deletions
diff --git a/src/content/entities/entity_wizard.rs b/src/content/entities/entity_wizard.rs
index eea2a48..6707f7c 100644
--- a/src/content/entities/entity_wizard.rs
+++ b/src/content/entities/entity_wizard.rs
@@ -142,7 +142,8 @@ pub fn entity_wizard_def(position: Vec2) -> EntityDef {
});
kinematic_controller.offset = CharacterLength::Absolute(0.1);
kinematic_controller.normal_nudge_factor = 1.0e-3;
- kinematic_controller.max_slope_climb_angle = 45f32.to_radians();
+ // slightly greater than 45 since 45 deg piles are very common for any kind of sand or dirt etc
+ kinematic_controller.max_slope_climb_angle = 48f32.to_radians();
EntityDef::kinematic_from_sprite(
position,
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(