From c420eada1f0558163b0a80b772d95a6d251dd886 Mon Sep 17 00:00:00 2001 From: _ <_@_> Date: Mon, 20 Dec 2021 01:45:33 +0000 Subject: [PATCH] the physics are pretty sketchy. Not sure what to work on next --- crate.png | Bin 1948 -> 1928 bytes src/bin/platformer/main.rs | 88 +++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/crate.png b/crate.png index 6c19367308ae7a879c731e6bc551f24cee5f279e..32838aeb940b66425214d2d4d0781d2758cbccbb 100644 GIT binary patch delta 1465 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 Result <()> { margin: 0.00125, }; - let player_speed = 2.0; - let player_jump_speed = 8.0; + let player_acc = 1.0; + let player_acc_air = 0.125; + let player_max_speed = 4.0; + let player_max_speed_air = 8.0; + let player_jump_speed = 12.0; + let kill_z = -3.0; let mut player_jump_vec: Option = None; game_state.reset_level (&level); @@ -184,35 +188,71 @@ async fn main () -> Result <()> { let kb_state = event_pump.keyboard_state (); - let player_speed = if let Some (v) = player_jump_vec.as_ref () { - if v.z > 0.5 { - game_state.player.vel.x = 0.0; - game_state.player.vel.y = 0.0; - player_speed - } - else { - 0.125 - } - } - else { - 0.125 - }; + let mut wanted_dir = Vec3::default (); if kb_state.is_scancode_pressed (Scancode::Left) { - game_state.player.vel.x -= player_speed; + wanted_dir.x -= 1.0; } if kb_state.is_scancode_pressed (Scancode::Right) { - game_state.player.vel.x += player_speed; + wanted_dir.x += 1.0; } if kb_state.is_scancode_pressed (Scancode::Up) { - game_state.player.vel.y += player_speed; + wanted_dir.y += 1.0; } if kb_state.is_scancode_pressed (Scancode::Down) { - game_state.player.vel.y -= player_speed; + wanted_dir.y -= 1.0; } + let wanted_dir = if wanted_dir.length_squared () >= 1.0 { + wanted_dir.normalize () + } + else { + wanted_dir + }; + + let old_vel = game_state.player.vel; + let old_vel_2 = old_vel * Vec3::new (1.0, 1.0, 0.0); + + let new_vel_2 = match player_jump_vec.as_ref () { + Some (v) => { + // Ground + let acc = player_acc * v.z * v.z; + let wanted_vel = wanted_dir * player_max_speed; + let diff = wanted_vel - old_vel_2; + + if diff.length_squared () < acc * acc { + // We're near the wanted velocity, so snap to it + wanted_vel + } + else { + // We're not near the wanted velocity, so accelerate + old_vel_2 + diff.normalize_or_zero () * acc + } + }, + // Air + None => { + let proposed_vel = old_vel_2 + wanted_dir * player_acc_air; + + if old_vel_2.length_squared () < player_max_speed_air * player_max_speed_air { + // Air control is normal below player_max_speed + proposed_vel + } + else { + // If the player's input would push them beyond player_max_speed, + // apply drag to preserve overall energy + proposed_vel * old_vel_2.length () / proposed_vel.length () + } + }, + }; + + game_state.player.vel = new_vel_2; + game_state.player.vel.z = old_vel.z; + + dbg! (game_state.player.vel); + if player_wants_to_jump { if let Some (normal) = player_jump_vec.clone () { + game_state.player.vel.z = 0.0; game_state.player.vel += normal * player_jump_speed; } } @@ -220,8 +260,10 @@ async fn main () -> Result <()> { let phys_result = opengl_rust::physics::step (&phys_params, &game_state.phys_tris, &[], 0.5, &game_state.player); game_state.player = phys_result.body; + if game_state.player.pos.z < kill_z { + game_state.reset_level (&level); + } // tracing::debug! ("player pos: {}", game_state.player.pos); - // dbg! (player_jump_vec); player_jump_vec = None; for normal in &phys_result.normals_hit { @@ -238,6 +280,8 @@ async fn main () -> Result <()> { }); } + // dbg! (player_jump_vec); + window.gl_make_current (&gl_ctx).unwrap (); graphics.draw (&game_state, &mut gl_state, &level); @@ -286,7 +330,6 @@ impl LoadedLevel { } else if let Some (mesh) = node.mesh () { - println! ("Node {:?} is a mesh", node.name ()); for (i, prim) in mesh.primitives ().enumerate () { let positions = match prim.get (&Semantic::Positions) { None => continue, @@ -312,9 +355,6 @@ impl LoadedLevel { None => continue, Some (x) => x, }; - dbg! (positions.offset (), pos_view.offset (), pos_view.stride ()); - dbg! (normals.offset (), norm_view.offset (), norm_view.stride ()); - dbg! (indices.offset (), indices.data_type (), indices_view.offset (), indices_view.stride ()); } } }