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

GameMaker角色跳跃移动时仅播放下落动画问题求助

GameMaker角色跳跃动画修复方案

问题根源分析

你的代码存在两处核心逻辑错误:

  • 水平移动分支中,错误地将vsp <= 0(包含上升阶段vsp<0)判定为下落状态,直接设置了下落动画spr_freefall_strip2
  • 重力处理部分的代码会覆盖之前设置的精灵,导致动画逻辑冲突
  • 手动维护jumpFrame反而增加复杂度,GameMaker自带的image_speed足以控制动画播放速度

修复后的完整代码

CREATE 事件

// Constants
moveSpeed = 5;
acceleration = 1.6;
deceleration = 1;
jumpPower = 12;
grav = 0.5;
maxFallSpeed = 50;

// Initialize variables
hsp = 0;
vsp = 0;
canJump = true;
image_xscale = 2;

// 初始化动画速度,按需调整(数值越大播放越快)
image_speed = 0.2;

STEP 事件

// Horizontal Movement
var moveInput = keyboard_check(vk_right) - keyboard_check(vk_left);
var isGrounded = place_meeting(x, y + 1, obj_wall);

// 水平移动逻辑
if (moveInput != 0) {
    hsp += moveInput * acceleration;
    hsp = clamp(hsp, -moveSpeed, moveSpeed);
    // 翻转精灵方向
    image_xscale = moveInput > 0 ? 2 : -2;
} else {
    // 减速逻辑
    if (hsp != 0) {
        var dir = sign(hsp);
        hsp -= dir * deceleration;
        if (sign(hsp) != dir) hsp = 0;
    }
}

// 跳跃逻辑
if (isGrounded) {
    canJump = true;
}
if (canJump && keyboard_check_pressed(vk_space)) {
    vsp = -jumpPower;
    canJump = false;
}

// 重力应用
if (!isGrounded) {
    vsp += grav;
    vsp = clamp(vsp, -maxFallSpeed, maxFallSpeed); // 限制上升速度,避免过快
} else {
    vsp = 0;
}

// 精灵状态判定(核心修复部分)
if (isGrounded) {
    if (moveInput != 0) {
        sprite_index = spr_run_strip6;
    } else {
        sprite_index = spr_idle_strip1;
    }
} else {
    if (vsp < 0) {
        // 上升阶段:播放跳跃动画
        sprite_index = spr_jump_strip4;
    } else {
        // 下落阶段:播放自由落体动画
        sprite_index = spr_freefall_strip2;
    }
}

// 水平碰撞处理
if (place_meeting(x + hsp, y, obj_wall)) {
    while (!place_meeting(x + sign(hsp), y, obj_wall)) {
        x += sign(hsp);
    }
    hsp = 0;
}
x += hsp;

// 垂直碰撞处理
if (place_meeting(x, y + vsp, obj_wall)) {
    while (!place_meeting(x, y + sign(vsp), obj_wall)) {
        y += sign(vsp);
    }
    vsp = 0;
}
y += vsp;

关键改动说明

  1. 简化精灵判定逻辑:将所有精灵状态判断集中到最后,避免多次赋值导致的覆盖问题
  2. 修正跳跃阶段判定:明确vsp < 0为上升阶段,使用spr_jump_strip4;vsp >= 0为下落阶段,使用spr_freefall_strip2
  3. 移除手动帧计数器:改用GameMaker原生的image_speed控制动画播放速度,调整数值即可改变快慢
  4. 整理代码结构:将移动、跳跃、重力、精灵判定、碰撞处理按逻辑顺序拆分,更易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:23:10