Input 8.0 Beta
全面跨平台输入库,适用于 GameMaker 2022 LTS,由 Juju Adams、Alynne Keith 和 朋友们 开发
在 Discord 服务器 上讨论 Input
Input 是一个强大且功能丰富的输入库,将键盘、鼠标和游戏手柄的控制统一在一个框架下。它处理热插拔、重绑定、手柄类型检测、玩家手柄分配、摇杆的最小/最大死区等所有功能,完全不需要你额外设置。这个库大大简化了为每个平台配置每种游戏手柄的重复性工作,加速了你的游戏开发进程。
Input 构建于与引擎无关的 SDL2 重新映射系统 之上,使用社区贡献的绑定,涵盖了所有常见的游戏手柄,甚至是你可能从未听说过的手柄。因为这个系统基于多年社区贡献,SDL2 和 Input 能够完美支持几乎所有奇异和独特的输入设备,几乎找不到 SDL2 不支持的设备。
相比 GameMaker 原生的游戏手柄实现,Input 是一个显著的改进,解决了跨平台不一致性和偶尔的致命问题。它是 GameMaker 基本游戏手柄和键盘实现的一个巨大的进步。
Input 是一个非常庞大的库!要快速上手,请查看我们的 新手指南。
Input 支持哪些平台?
几乎所有平台!对于我们不定期测试的平台,你可能会遇到一些边缘情况;如果发现任何问题,请随时报告 Bug。
Input 支持哪些版本的 GameMaker?
Input 主要支持 GameMaker LTS 2022,理论上也支持其后的所有版本。尽管后续的 GameMaker 版本可能会改变某些功能,导致 Input 无法向前兼容,但 Input 仅使用 GameMaker 原生函数,因此在长期兼容性上处于最优位置。
Input 的许可是什么?我能在商业项目中使用吗?
Input 采用 MIT 许可证发布。这意味着你可以将它用于任何用途,包括商业项目。如果你能在游戏的致谢名单中提到我们(“Juju Adams, Alynne Keith, and Friends”)并/或表示感谢,我们会非常感激,但你没有任何义务这么做。
我觉得缺少了一个有用的功能,希望你们实现它!
很棒!请提交一个功能请求。功能请求让 Input 成为一个更有趣的工具,并为我们设立了新的目标。
我发现了一个 Bug,这个 Bug 让我既害怕又略感烦恼。解决它的最佳方法是什么?
请提交错误报告。我们每天都会检查 GitHub,通常几天后就会发布 Bug 修复。你也可以在 Discord 服务器 上联系我们,但清晰的 Bug 报告会更有效。
Input 是谁开发的?
Input 主要由 Juju 和 Alynne 开发和维护,他们已经编写和重写了多次输入系统。Juju 曾参与开发多款商业 GameMaker 游戏,Alynne 多年来一直活跃在独立开发社区。Input 是我们在担任顾问时积累的实际经验的结晶。
许多其他人在 GameMaker 的开源社区中通过错误报告和功能请求做出了贡献。没有他们的创意和耐心,Input 就不会存在。我们对他们深表感激。你可以在Input 的致谢页面中阅读相关信息。
我可以向你们捐款吗?你们打算启动 Patreon 吗?
感谢你想表达对我们的支持——这对我们个人而言非常重要——但幸运的是,我们已经从游戏开发中获得了稳定的收入。我们目前不打算作为创作者加入 Patreon。如果你想支持我们的工作,可以在你的游戏中提到我们,或在你喜欢的社交媒体平台上为我们点赞。
新手指南
本指南最初由社区成员 Grace 撰写。
你好!也许你听说这个插件为你提供了一些新工具可以使用。也许你已经尝试让它工作,但可能错过了一两个关键细节,导致它没能成功运行。别担心,我马上会教你如何操作。本指南假设你对 GameMaker 有一定的基础知识,不会涉及游戏具体功能的制作,而是专注于如何让输入系统开始读取你的输入。
第一步:设置
首先,你需要将获得的 .yymps 文件 拖入你的项目中。对话框弹出后,点击“添加全部”,然后点击“确定”。这会在资源浏览器中新增一个名为“Input”的文件夹。这是你需要的。
输入系统在游戏启动时会通过内部对象创建一个实例。确保不要意外销毁或停用这个实例!
第二步:动作定义
现在我们可以开始体验这个输入系统的核心功能了。接下来我们将定义一些“动作”。
动作 是你希望向玩家提供的基本输入行为;包括跳跃、射击、暂停游戏或朝某个方向移动。通过使用动作,我们可以抽象用户输入,这样在游戏运行过程中可以更换输入源,而无需修改其他部分。使用动作还可以更方便地实现按键重绑定。
接下来我们来定义一些动作!要为动作定义默认绑定,你需要编辑 __input_config_verbs()
脚本。在导入 Input 插件后,它会附带一些默认的控制设置。为了更好地说明,我们将删除 __input_config_verbs()
中的所有内容,从头开始。
我将定义三个控制动作,分别是向左、向右和射击。
return {
// 将键盘控制绑定到动作
keyboard_and_mouse:
{
left: input_binding_key(vk_left),
right: input_binding_key(vk_right),
shoot: input_binding_key("A"),
},
};
我们使用 input_binding_key()
函数接收标准 GM 输入功能的常规按键值,然后将其绑定到我们想要分配的动作(动词)上。
这是一个可以放在角色对象中的 Step 事件代码:
// 如果激活了 Left 或 Right 动作,则移动玩家
if (input_check("left")) x -= 4;
if (input_check("right")) x += 4;
// 如果玩家按下了 "Shoot" 按钮,则发射子弹
if (input_check_pressed("shoot")) show_debug_message("bang");
如果你对标准 GML 输入函数比较熟悉,这段代码应该看起来很熟悉了。input_check()
类似于 keyboard_check()
,而 input_check_pressed()
类似于 keyboard_check_pressed()
。
现在,运行游戏,看看你的成果!这输入系统用起来是不是很顺手?按钮是不是很有趣?
不过此时,你可能会问自己:“Grace,为什么我不直接用 keyboard_check
函数,而要这么麻烦呢?”
哦,天真可爱的孩子,你以为我们就到此为止了吗?
第三步:游戏手柄绑定
让我们回到 __input_config_verbs()
中的默认配置文件。
看看我们即将添加的新代码:
return {
// 将键盘控制绑定到动作
keyboard_and_mouse:
{
left: input_binding_key(vk_left),
right: input_binding_key(vk_right),
shoot: input_binding_key("A"),
},
// 将游戏手柄控制绑定到动作
gamepad:
{
left: input_binding_gamepad_axis(gp_axislh, true),
right: input_binding_gamepad_axis(gp_axislh, false),
shoot: input_binding_gamepad_button(gp_face1),
},
};
和键盘绑定函数类似,游戏手柄绑定函数使用标准 GM 功能中的常规游戏手柄输入值。恭喜,你现在也支持游戏手柄输入了。
输入系统默认会在游戏启动时自动扫描游戏手柄输入。如果玩家使用键盘,输入系统会切换到 keyboard_and_mouse
配置文件;如果玩家使用游戏手柄,系统会切换到 gamepad
配置文件(这些配置文件的名称可以通过修改一些宏来控制)。
第四步:后续步骤
在第二步中,我们使用了 input_check()
来在某个动作被激活时移动角色。如果使用游戏手柄,当玩家使用摇杆或触发轴时,输入可能是模拟的(即 0
到 1
之间的分数值),而不是数字的(布尔值 true
或 false
)。你可以使用 input_value()
获取模拟输入值。如果你想处理二维移动,可以参考 2D 检查函数。
这只是 Input 系统功能的冰山一角。更多示例可以在 GitHub 主仓库 中找到,包括按键重绑定和多人游戏的示例。你还可以深入阅读文档,了解 Input 的更多功能。如果你遇到问题或想要快速得到答案,欢迎 加入我们的 Discord。