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

GML玩家精灵频繁切换、落地后仅可跳跃问题求助

GameMaker玩家移动&动画Bug修复方案

核心问题定位及修复

以下是针对「持续下滑、落地后水平移动失效、精灵闪烁」三个问题的具体修复:


1. 跳跃逻辑语法错误(导致落地后状态异常)

原代码中跳跃判断的canJump -- > 0是错误写法:

if (canJump -- > 0) && (_keyJump)

--是后置递减运算符,会每帧强制让canJump减1(哪怕没按跳跃键),导致落地后设置的canJump=7会在7帧后直接归零,同时干扰移动逻辑的状态判断。

修复为:

if (canJump > 0 && _keyJump)

2. 地面检测精度问题(导致精灵快速切换闪烁)

原动画逻辑用place_meeting(x,y+1,obj_wall)判断是否落地,y+1的固定偏移会因为精灵原点、碰撞盒位置,出现「时而检测到地面、时而检测不到」的帧间波动,导致精灵在跳跃和idle状态来回跳。

修复方案:直接复用碰撞处理中已经确认的canJump状态(canJump>0就代表玩家在地面),替换动画判断逻辑:

//Animation
if (canJump == 0) // 不在地面时显示跳跃精灵
{
    sprite_index = spr_player_jumping;
    image_speed = 0;
    image_index = sign(vsp) > 0 ? 1 : 0;
}
else // 在地面时根据水平速度切换 idle/奔跑
{
    image_speed = 1;
    sprite_index = hsp == 0 ? spr_player_idle : spr_player_running;
}

3. 水平移动无响应问题(落地后冻结)

结合上面的修复后,再检查两个关键点:

  • 确保obj_wall的碰撞盒没有错误覆盖玩家的水平移动路径(比如碰撞盒过高,导致玩家落地后被墙的碰撞盒卡住水平移动)
  • 原水平碰撞逻辑中,while循环的处理可以简化,避免因浮点精度问题导致hsp无法归零:
    //Collide and Move - 水平部分优化
    if (place_meeting(x + hsp, y, obj_wall))
    {
        // 直接移动到碰撞边缘,替代循环减半的逻辑
        while (!place_meeting(x + sign(hsp), y, obj_wall))
        {
            x += sign(hsp);
        }
        hsp = 0;
    }
    x += hsp;
    

修复后完整Step Event代码

//Get Player Input
var _keyLeft = keyboard_check(vk_left);
var _keyRight = keyboard_check(vk_right);
var _keyJump = keyboard_check_pressed(vk_space);

//Work out where to move horizontally
hsp = (_keyRight - _keyLeft) * hspWalk;

//Work out where to move vertically
vsp = vsp + grv;

//Work out if we should jump
if (canJump > 0 && _keyJump)
{
    vsp = vspJump;
    canJump = 0;
}

//Collide and Move - 水平
if (place_meeting(x + hsp, y, obj_wall))
{
    while (!place_meeting(x + sign(hsp), y, obj_wall))
    {
        x += sign(hsp);
    }
    hsp = 0;
}
x += hsp;

//Collide and Move - 垂直
if (place_meeting(x, y + vsp, obj_wall))
{
    if (vsp > 0) canJump = 7;
    while (!place_meeting(x, y + sign(vsp), obj_wall))
    {
        y += sign(vsp);
    }
    vsp = 0;
}
y += vsp;

//Animation
if (canJump == 0)
{
    sprite_index = spr_player_jumping;
    image_speed = 0;
    image_index = sign(vsp) > 0 ? 1 : 0;
}
else
{
    image_speed = 1;
    sprite_index = hsp == 0 ? spr_player_idle : spr_player_running;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:57:15