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;
关键改动说明
- 简化精灵判定逻辑:将所有精灵状态判断集中到最后,避免多次赋值导致的覆盖问题
- 修正跳跃阶段判定:明确
vsp < 0为上升阶段,使用spr_jump_strip4;vsp >= 0为下落阶段,使用spr_freefall_strip2 - 移除手动帧计数器:改用GameMaker原生的
image_speed控制动画播放速度,调整数值即可改变快慢 - 整理代码结构:将移动、跳跃、重力、精灵判定、碰撞处理按逻辑顺序拆分,更易维护
内容的提问来源于stack exchange,提问作者ConvexProjects
相关产品推荐
相关产品推荐

