GameMaker Studio 2赛车移动脚本求助:图形异常+代码简化与转向需求
问题解决与优化方案
一、图形异常的根源与修复
原代码同时修改内置speed变量,又手动通过lengthdir_x/y更新x/y坐标,导致GameMaker内置移动逻辑与自定义移动逻辑冲突,引发抖动、瞬移等图形异常。核心修复方式是放弃使用内置speed变量,改用自定义变量存储当前速度,彻底避免逻辑冲突。
二、简化后的完整代码(含转向功能)
// objPlayerCar Step事件脚本 // 自定义移动参数(可根据手感调整) var _accel = 0.8; var _decel = 0.3; var _max_speed = 5; var _min_speed = -2; var _friction = 0.1; var _turn_speed = 3; // 基础转向速度 // 初始化自定义速度(首次运行时赋值) if (!variable_exists("current_speed")) { current_speed = 0; } // 1. 油门/刹车逻辑 if (keyboard_check(ord("S"))) { current_speed += _accel; } else if (keyboard_check(ord("W"))) { current_speed -= _accel; } else { // 无输入时自动减速 current_speed = approach(current_speed, 0, _decel); } // 2. 应用摩擦力 current_speed = approach(current_speed, 0, _friction); // 3. 限制速度范围 current_speed = clamp(current_speed, _min_speed, _max_speed); // 4. 转向逻辑(仅当车辆有速度时生效,符合真实驾驶逻辑) if (current_speed != 0) { var _turn_dir = 0; if (keyboard_check(ord("A"))) _turn_dir = -1; if (keyboard_check(ord("D"))) _turn_dir = 1; // 高速时转向幅度降低,提升操作真实感 var _turn_factor = abs(current_speed) / _max_speed; direction += _turn_dir * _turn_speed * _turn_factor; } // 5. 执行移动(仅用自定义速度计算,避免冲突) x += lengthdir_x(current_speed, direction); y += lengthdir_y(current_speed, direction);
三、关键优化说明
- 图形异常修复:用自定义
current_speed替代内置speed,消除双重移动逻辑冲突,彻底解决抖动、瞬移问题。 - 代码简化:使用
approach()函数替代重复的if-else减速判断,用clamp()函数简化速度范围限制,逻辑更简洁易读。 - 转向功能实现:
- 仅当车辆有速度时允许转向,符合真实驾驶逻辑;
- 加入速度关联的转向系数,高速时转向更平缓,优化操作手感;
- 通过A/D键控制左右转向,转向速度可通过
_turn_speed灵活调整。
内容的提问来源于stack exchange,提问作者Adam Moss
相关产品推荐
相关产品推荐

