better feeling movement
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 31 Dec 2021 02:15:21 +0000 (20:15 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 31 Dec 2021 02:15:21 +0000 (20:15 -0600)
src/chunk.onyx
src/player.onyx

index 6afef32dbee0e11b609b09eed1cf12e3ab3f0192..d915d8c6ada72a60a77e21f53e59e59ee1885eeb 100644 (file)
@@ -154,7 +154,7 @@ chunk_foreach :: macro (chunk: ^Chunk, body: Code) {
     }
 }
 
-block_highlight: ^Mesh(Chunk_Vertex);
+#local block_highlight: ^Mesh(Chunk_Vertex);
 chunk_highlight_block :: (x, y, z: f32) {
     data := 0xf000;
 
index 49c8cc82969c3f816caadf67cdc167176a2b5560..e9d6ecb93e9d58c2187df446850f9a6b2b796a0c 100644 (file)
@@ -37,24 +37,20 @@ player_update :: (use player: ^Player, dt: f32) {
     while camera.y_rot < 0 do camera.y_rot += 2 * math.PI;
     camera.x_rot = math.clamp(camera.x_rot, -math.PI / 2 + 0.01, math.PI / 2 - 0.01);
 
-    body.vel = .{0,body.vel.y,0};
-
     forward := camera_get_forward(camera);
     facing := forward;
     facing.y = 0;
     facing = Vector3.norm(facing);
-    if is_key_down(GLFW_KEY_W) {
-        body.vel += facing * speed;
-    }
-    if is_key_down(GLFW_KEY_S) {
-        body.vel -= facing * speed;
-    }
-    if is_key_down(GLFW_KEY_D) {
-        body.vel += Vector3.norm(Vector3.cross(facing, .{0,1,0})) * speed;
-    }
-    if is_key_down(GLFW_KEY_A) {
-        body.vel -= Vector3.norm(Vector3.cross(facing, .{0,1,0})) * speed;
-    }
+
+    xz_vel := Vector3.{0,0,0};
+    if is_key_down(GLFW_KEY_W) do xz_vel += facing;
+    if is_key_down(GLFW_KEY_S) do xz_vel -= facing;
+    if is_key_down(GLFW_KEY_D) do xz_vel += Vector3.norm(Vector3.cross(facing, .{0,1,0}));
+    if is_key_down(GLFW_KEY_A) do xz_vel -= Vector3.norm(Vector3.cross(facing, .{0,1,0}));
+
+    if Vector3.mag(xz_vel) > 0 do xz_vel = Vector3.norm(xz_vel) * speed;
+    body.vel.x = xz_vel.x;
+    body.vel.z = xz_vel.z;
 
     physics_apply_gravity(^body);
 
@@ -69,10 +65,10 @@ player_update :: (use player: ^Player, dt: f32) {
 
     camera.position = body.pos;
 
+    ray_cast_to_block :: (_, p) => world_get_block(world, p.x, p.y, p.z) != Block_Empty;
+
     dir: Vector3i;
-    if !ray_cast(.{ camera.position, forward }, 10, null, (_, p) => {
-        return world_get_block(world, p.x, p.y, p.z) != Block_Empty;
-    }, ^selected_block, ^dir) {
+    if !ray_cast(.{ camera.position, forward }, 10, null, ray_cast_to_block, ^selected_block, ^dir) {
         selected_block = .{0,0,0};
     }
 
@@ -87,11 +83,11 @@ player_update :: (use player: ^Player, dt: f32) {
 
 player_get_aabb :: (pos: Vector3) -> AABB {
     return .{
-        x0 = pos.x - 0.25f,
+        x0 = pos.x - 0.3f,
         y0 = pos.y - 1.8f,
-        z0 = pos.z - 0.25f,
-        x1 = pos.x + 0.25f,
+        z0 = pos.z - 0.3f,
+        x1 = pos.x + 0.3f,
         y1 = pos.y + 0.1f,
-        z1 = pos.z + 0.25f,
+        z1 = pos.z + 0.3f,
     };
 }