如何在GameMaker中实现平滑跳跃而非瞬移效果
平台游戏平滑跳跃问题修复
核心问题分析
你的代码里有几个关键错误导致角色瞬移而非平滑移动:
xvel和yvel用var声明为局部变量,每帧执行脚本时都会被重置为0,速度无法持续累积,自然没法实现平滑的加速/跳跃- 跳跃用了
keyboard_check(持续检测按键),按住空格会不断触发跳跃逻辑,导致y轴速度异常 - 重力逻辑只在未按空格时生效,空中状态判断错误
修正后的代码
首先把xvel和yvel改成实例变量(在对象的Create事件里声明,不要放在步事件的脚本里):
// Create事件 xvel = 0; yvel = 0; grav = 0.8; // 重力值,可根据手感调整 jump_force = -12; // 跳跃力度,负数对应GameMaker默认y轴向上的方向 move_speed = 5; // 水平移动速度 friction = 0.6; // 摩擦力,控制减速平滑度
然后修改步事件的移动脚本:
// 水平移动逻辑 xvel = 0; // 先重置水平速度,避免持续加速 if (keyboard_check(vk_left)) { xvel = -move_speed; } if (keyboard_check(vk_right)) { xvel = move_speed; } // 无方向输入时应用摩擦力,实现平滑减速 if (xvel == 0) { xvel = xvel * friction; } // 全局重力应用(不管是否按空格,空中都会下落) yvel += grav; // 跳跃触发(仅在按键按下瞬间生效,且角色站在地面) if (keyboard_check_pressed(vk_space) && place_meeting(x, y + 1, obj_wall)) { yvel = jump_force; } // 水平碰撞校正,避免穿墙并重置速度 x += xvel; if (place_meeting(x, y, obj_wall)) { while (!place_meeting(x + sign(xvel), y, obj_wall)) { x += sign(xvel); } xvel = 0; } // 垂直碰撞校正,落地时重置垂直速度 y += yvel; if (place_meeting(x, y, obj_wall)) { while (!place_meeting(x, y + sign(yvel), obj_wall)) { y += sign(yvel); } yvel = 0; }
关键修改点说明
- 将速度变量移到Create事件作为实例变量,确保每帧能保留上一帧的速度值
- 用
keyboard_check_pressed替代keyboard_check触发跳跃,避免按住空格持续跳跃 - 重力逻辑独立,只要角色不在地面就持续生效,保证下落平滑
- 添加碰撞校正逻辑,避免角色穿墙,同时让碰撞后的速度重置更合理
- 调整水平移动逻辑,用固定速度+摩擦力实现自然的加速/减速
内容的提问来源于stack exchange,提问作者xemopy
相关产品推荐
相关产品推荐

