GML中是否存在等待函数?如何实现按键移动物体后停留2秒的需求?
实现思路
- 用
keyboard_check_pressed()替代你当前使用的按键检测函数,该函数仅在按键按下的第一帧返回true,按住时不会重复触发,直接解决按住按键对象持续滑动的问题。 - 用状态机拆分整个动作流程,避免复杂嵌套的if语句,整个流程拆分为4个独立状态:等待触发状态、向右移动状态、返回初始位置状态、冷却停留状态,逻辑清晰不易出错。
- 用内置变量
delta_time计算各阶段时长,不会阻塞游戏主线程运行。
完整代码实现
你可以直接把对应代码复制到对象的对应事件中即可运行:
Create 事件(初始化变量用)
// 状态定义:0=等待触发 1=向右移动 2=返回原点 3=冷却停留 state = 0 // 存储对象初始坐标 start_x = x start_y = y // 时间计数器(单位:秒) timer = 0 // 移动参数配置 move_speed = 2 // 对应你之前用的x += 2的移动速度 move_duration = 2 // 向右移动总时长2秒 cooldown_duration = 2 // 回到原点后停留时长2秒 // 触发按键配置,当前设置为右方向键,可自行修改 trigger_key = vk_right
Step 事件(每帧运行的逻辑)
switch(state) { case 0: // 等待触发状态 if keyboard_check_pressed(trigger_key) { timer = 0 state = 1 } break; case 1: // 向右移动状态 x += move_speed timer += delta_time / 1000000 // 把微秒单位转为秒 if timer >= move_duration { timer = 0 state = 2 } break; case 2: // 返回初始位置状态 // 如需平滑返回,可模仿右移逻辑修改,当前为瞬间回到原点 x = start_x state = 3 break; case 3: // 冷却停留状态 timer += delta_time / 1000000 if timer >= cooldown_duration { state = 0 } break; }
可选调整说明
- 如需平滑返回初始位置,只需要修改
case 2的逻辑,参考右移阶段的写法,每帧将x向start_x方向移动,直到坐标对齐后再切换到冷却状态即可 - 如需修改触发按键,把Create事件里的
trigger_key改成对应常量即可,比如ord("D")对应键盘D键 - 不需要返回后停留的话,直接把
cooldown_duration改成0即可
内容的提问来源于stack exchange,提问作者Kokoriko
相关产品推荐
相关产品推荐

