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

GameMaker单向移动平台问题:无法反复站立并跳跃

单向移动平台站立问题修复方案

这是游戏中使用的可穿透跳跃平台(单向平台),当前存在问题:角色跳上平台后无法再次站立,会直接掉落。

原代码

...
move_dir = right_key - left_key
x_speed = move_dir * move_speed;
// Y MOVEMENT
y_speed += grav;
if jump_key && (place_meeting( x, y + 1, collision_objects) || place_meeting(x, y + 1, oplatformmoving))
{ 
    y_speed = jump_speed;
}

// COLLISIONS
// Moving Platform Collision
var _movingplatform = instance_place(x, y + max(1, y_speed), oplatformmoving);
if (_movingplatform && bbox_bottom <= _movingplatform.bbox_top) {
    if (y_speed > 0) {
        while (!place_meeting(x, _movingplatform.bbox_top, oplatformmoving)) {
            y += sign(y_speed);
        }
        y_speed = 0;
    }
    x += _movingplatform.moveX;
    y += _movingplatform.moveY;
}
...

问题分析

你的碰撞逻辑只在角色从下方首次接触平台时生效:bbox_bottom <= _movingplatform.bbox_top这个条件仅在角色刚跳到平台上方的瞬间成立。当角色站在平台上后,后续帧中角色的bbox_bottom会超过平台的bbox_top,导致碰撞检测失效,角色失去平台支撑直接掉落。

修复方案

添加一个变量追踪当前站立的平台,拆分碰撞逻辑为「首次接触」和「持续站立」两种情况:

步骤1:初始化追踪变量

在角色的Create事件中添加:

_current_platform = noone; // 记录当前站立的移动平台

步骤2:修改移动与碰撞代码

...
move_dir = right_key - left_key
x_speed = move_dir * move_speed;
// Y MOVEMENT
y_speed += grav;

// 跳跃检测:包含普通地面和当前站立的移动平台
var _on_ground = place_meeting(x, y + 1, collision_objects) || (instance_exists(_current_platform) && place_meeting(x, y + 1, _current_platform));
if jump_key && _on_ground
{ 
    y_speed = jump_speed;
    _current_platform = noone; // 跳跃时脱离平台追踪
}

// COLLISIONS
// Moving Platform Collision
var _movingplatform = instance_place(x, y + max(1, y_speed), oplatformmoving);

// 情况1:从下方首次跳上平台
if (_movingplatform && bbox_bottom <= _movingplatform.bbox_top && y_speed > 0) {
    // 修正角色位置到平台顶部
    while (!place_meeting(x, _movingplatform.bbox_top, oplatformmoving)) {
        y += sign(y_speed);
    }
    y_speed = 0;
    _current_platform = _movingplatform; // 开始追踪该平台
}
// 情况2:已经站在平台上,持续跟随平台移动
else if (instance_exists(_current_platform) && place_meeting(x, y, _current_platform)) {
    x += _current_platform.moveX;
    y += _current_platform.moveY;
    // 检查是否仍在平台上,防止平台移动后角色脱离
    if (!place_meeting(x, y + 1, _current_platform)) {
        _current_platform = noone;
    }
}
...

关键修改点

  • 用_current_platform持续追踪当前站立的平台,确保站立状态下每帧都能跟随平台移动。
  • 跳跃检测时纳入_current_platform,保证角色站在平台上时能正常触发跳跃。
  • 拆分碰撞逻辑,分别处理首次接触和持续站立的场景,避免单一条件导致的站立失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:12:24