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
相关产品推荐
相关产品推荐

