SDL角色跳跃平滑性问题求助:跳跃直接瞬移而非平滑移动
跳跃平滑问题的解决思路
核心问题分析
你代码里的velY = 0;是导致瞬移的关键——每次调用Movement都强制把纵向速度清零,使得跳跃的初始向上速度仅在按下空格的那一帧生效,之后速度直接归零,角色自然只会瞬间移动一段距离,无法形成平滑的抛物线运动。
具体修改步骤
移除
velY = 0;语句
这行代码直接销毁了跳跃速度的持续作用,必须删除,让velY能够在重力影响下逐渐变化。调整重力与速度、位置的更新顺序
重力的正确作用方式是先改变速度,再用速度更新位置,这样才能模拟出速度随时间变化的物理效果:// 重力持续作用于速度,让速度逐渐变化 velY += g; // 用更新后的速度计算新位置 player.posY += velY;完善地面碰撞逻辑
角色落地时需要重置速度和跳跃冷却,避免异常运动并允许再次跳跃:if (player.posY >= SCREEN_HEIGHT - player.width / 2) { player.posY = SCREEN_HEIGHT - player.width / 2; velY = 0; // 落地后速度清零,防止继续下沉 yes = 0; // 重置冷却,允许再次触发跳跃 }优化跳跃触发条件(可选)
原逻辑只要yes==0就允许跳跃,可能导致空中二段跳。如果不需要这个功能,要加上地面检测的判断:if (keyboardHandle[SDL_SCANCODE_SPACE] && yes == 0 && player.posY >= SCREEN_HEIGHT - player.width / 2)
修改后的完整代码示例
void Movement(const Uint8 *keyboardHandle) { // 仅在地面且冷却完成时触发跳跃 if (keyboardHandle[SDL_SCANCODE_SPACE] && yes == 0 && player.posY >= SCREEN_HEIGHT - player.width / 2) { velY = -20; yes = 100; } // 重力更新速度 velY += g; // 速度更新位置 player.posY += velY; // 地面碰撞处理 if (player.posY >= SCREEN_HEIGHT - player.width / 2) { player.posY = SCREEN_HEIGHT - player.width / 2; velY = 0; yes = 0; } // 更新跳跃冷却 if(yes > 0) { yes--; } }
内容的提问来源于stack exchange,提问作者yesyes
相关产品推荐
相关产品推荐

