]> git.lizzy.rs Git - minetest.git/commitdiff
Improve double tap for jump detection (#12793)
authorMuhammad Rifqi Priyo Susanto <muhammadrifqipriyosusanto@gmail.com>
Fri, 30 Sep 2022 12:02:06 +0000 (19:02 +0700)
committerGitHub <noreply@github.com>
Fri, 30 Sep 2022 12:02:06 +0000 (14:02 +0200)
src/client/game.cpp

index e62d0f4a3b7a81d7f5bcff5594b5d747b18194c8..9f71850f9fe05cde88a3e9bf19f8a1a428f0117d 100644 (file)
@@ -676,7 +676,10 @@ struct GameRunData {
        float time_from_last_punch;
        ClientActiveObject *selected_object;
 
-       float jump_timer;
+       float jump_timer_up;          // from key up until key down
+       float jump_timer_down;        // since last key down
+       float jump_timer_down_before; // from key down until key down again
+
        float damage_flash;
        float update_draw_list_timer;
 
@@ -1958,8 +1961,10 @@ void Game::processUserInput(f32 dtime)
 #endif
 
        // Increase timer for double tap of "keymap_jump"
-       if (m_cache_doubletap_jump && runData.jump_timer <= 0.2f)
-               runData.jump_timer += dtime;
+       if (m_cache_doubletap_jump && runData.jump_timer_up <= 0.2f)
+               runData.jump_timer_up += dtime;
+       if (m_cache_doubletap_jump && runData.jump_timer_down <= 0.4f)
+               runData.jump_timer_down += dtime;
 
        processKeyInput();
        processItemSelection(&runData.new_playeritem);
@@ -2080,7 +2085,7 @@ void Game::processKeyInput()
 
        if (!isKeyDown(KeyType::JUMP) && runData.reset_jump_timer) {
                runData.reset_jump_timer = false;
-               runData.jump_timer = 0.0f;
+               runData.jump_timer_up = 0.0f;
        }
 
        if (quicktune->hasMessage()) {
@@ -2221,7 +2226,14 @@ void Game::toggleFreeMove()
 
 void Game::toggleFreeMoveAlt()
 {
-       if (m_cache_doubletap_jump && runData.jump_timer < 0.2f)
+       if (!runData.reset_jump_timer) {
+               runData.jump_timer_down_before = runData.jump_timer_down;
+               runData.jump_timer_down = 0.0f;
+       }
+
+       // key down (0.2 s max.), then key up (0.2 s max.), then key down
+       if (m_cache_doubletap_jump && runData.jump_timer_up < 0.2f &&
+                       runData.jump_timer_down_before < 0.4f) // 0.2 + 0.2
                toggleFreeMove();
 
        runData.reset_jump_timer = true;