GameMaker制作带可控输入延迟赛车游戏及数据导出问题咨询
一、输入延迟功能实现思路
核心逻辑是构建输入缓存队列,输入先存入队列,达到设定延迟时长后再触发车辆控制逻辑,具体步骤如下:
- 先定义全局延迟参数:比如
global.input_delay = 500,单位统一用毫秒(避免浮点数精度问题),你可以在设置界面预设不同档位值,比如50ms、500ms对应需求中的0.05秒、0.5秒。 - 构建输入缓存队列:用GML内置的
ds_queue或者数组实现,队列每个元素存储三个字段:输入触发时间戳、输入状态(前进/左转/右转/刹车的布尔值)、预留输出结果字段。获取当前时间戳直接用current_time内置函数即可,返回值本身就是毫秒单位。 - 每帧Step事件处理逻辑:
- 每帧先采集当前输入状态,键盘输入用
keyboard_check()、手柄输入用gamepad_button_check()/gamepad_axis_value()判断,把当前时间戳、输入状态打包存入队列尾部。 - 检查队列头部元素,计算当前时间与元素存储时间的差值,当差值≥
global.input_delay时,取出该元素执行对应的车辆控制逻辑(加减速、转向等),同时把当前车辆的状态(速度、坐标、转向角等你需要的输出数据)存入元素的输出字段,再把该元素转存到操作日志数组中。
- 每帧先采集当前输入状态,键盘输入用
二、输入输出顺序存储实现
直接用全局数组存储所有完成处理的操作数据即可,不会出现乱序问题:
- 定义全局日志数组
global.operation_log = [] - 每个日志项用GML结构体存储,格式参考:
{ time: 1692345678, input: {up: true, left: false, right: false, brake: false}, output: {speed: 14.2, x: 320, y: 450, angle: 7.5} }
- 每处理完一个延迟输入,就用
array_push(global.operation_log, 处理完成的元素)把数据写入数组即可。
三、调查问卷与Excel导出实现说明
两个需求都可以直接用原生GML实现,不需要额外插件:
调查问卷模块
在游戏结束的房间做UI即可,选择题直接做按钮组件点击赋值,开放题可以用get_string_async内置函数获取用户输入,也可以自己绘制输入框控件,所有问卷结果统一存入一个全局结构体即可。
Excel导出功能
Excel可直接识别CSV格式文件,你只需要把日志和问卷数据拼接为CSV格式的字符串,写入本地存为.csv后缀的文件即可:
- 先拼接CSV表头,比如
"时间戳,前进输入,左转输入,右转输入,刹车输入,车辆速度,X坐标,Y坐标,转向角\n" - 遍历
global.operation_log数组,把每个字段按顺序用逗号分隔拼成一行,每行行尾加换行符\n,拼接到表头后面 - 问卷数据可以放在CSV的最后几行,也可以单独生成另一个CSV文件
- 用
file_text_write_string内置函数把拼接完成的字符串写入文件,存储路径用game_save_id即可获取合法的本地可写目录,生成的CSV文件可以直接用Excel打开。
四、新手注意事项
- 输入采集和逻辑处理都放在Step事件里执行即可,不要放在Draw事件中,避免帧率波动导致延迟不准
- 测试阶段可以把延迟设为2000ms,肉眼即可验证输入延迟是否生效,确认逻辑没问题再切换为实验需要的档位
- 不需要手动管理数组、结构体的内存,GML会自动执行垃圾回收
内容的提问来源于stack exchange,提问作者nightblen
相关产品推荐
相关产品推荐

