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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:09:01