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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:49:51