You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java游戏开发:如何根据按住跳跃键时长调整玩家跳跃高度?

按按住时长调整跳跃高度的实现方案

核心思路

原代码的问题是每帧重置跳跃速度为固定值,无法区分按住时长。我们需要通过跟踪上键的按下状态和持续时长,结合最大蓄力限制,动态调整跳跃初始速度,实现按住越久跳越高的效果。

所需新增变量

在类或全局范围内添加以下变量:

// 记录上键按下的起始帧,-1表示未处于蓄力状态
int jumpHoldStartFrame = -1;
// 上一帧的上键状态,用于检测按键的按下/松开边缘
boolean lastUpKey = false;
// 最大蓄力帧数(超过后不再增加跳跃高度)
final int MAX_HOLD_FRAMES = 30;
// 最小跳跃速度(轻按的情况)
final float MIN_JUMP_SPEED = -12;
// 最大跳跃速度(按住到上限的情况)
final float MAX_JUMP_SPEED = -30;
// 当前帧计数(如果游戏没有内置帧计数器,需要每帧自增维护)
int currentFrame = 0;

修改后的每帧逻辑代码

currentFrame++;
boolean isGrounded = (player[1] + player[3] >= base[1]);

// 检测上键按下的瞬间,开始蓄力
if (Keys.up && !lastUpKey) {
    if (isGrounded) {
        jumpHoldStartFrame = currentFrame;
    }
}

// 检测上键松开的瞬间,触发跳跃
if (!Keys.up && lastUpKey) {
    if (jumpHoldStartFrame != -1) {
        // 计算按住时长,不超过最大限制
        int holdFrames = Math.min(currentFrame - jumpHoldStartFrame, MAX_HOLD_FRAMES);
        // 线性计算跳跃速度:从最小到最大随按住时长变化
        float jumpSpeed = MIN_JUMP_SPEED + (MAX_JUMP_SPEED - MIN_JUMP_SPEED) * (holdFrames / (float)MAX_HOLD_FRAMES);
        // 应用跳跃速度
        player[5] = jumpSpeed;
        // 重置蓄力状态
        jumpHoldStartFrame = -1;
    }
}

// 玩家离开地面后,重置蓄力状态
if (!isGrounded) {
    jumpHoldStartFrame = -1;
}

// 更新上一帧按键状态
lastUpKey = Keys.up;

补充调整方案

如果想要实现类似马里奥的“按住持续上升”手感(而非蓄力后跳跃),可以替换上述松开触发逻辑为以下代码:

// 触地且按住上键时,持续增加向上速度,直到达到上限
if (Keys.up && isGrounded) {
    if (player[5] > MAX_JUMP_SPEED) {
        player[5] -= 0.8f;
    }
} 
// 松开上键后,立即停止加速,锁定当前速度不低于最小值
else if (!Keys.up && player[5] < MIN_JUMP_SPEED) {
    player[5] = Math.max(player[5], MIN_JUMP_SPEED);
}

内容的提问来源于stack exchange,提问作者Preston G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:12