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
相关产品推荐
相关产品推荐

