====== 自定义按键绑定 ======
==== 键盘绑定:直接从键盘输入 ====
Minecraft 用按键绑定功能来处理从键盘和鼠标等外部设备获取的用户输入。按下 W,角色就会向前走,按下 E,物品栏就会打开。每个绑定也都可以在设置菜单中配置,所以你可以用箭头键替代 WASD 来移动。
学习这篇教程前,需要配置好按键绑定 API,如果还没有配置好,在 [[zh_cn:documentation:fabric_mod_json|fabric.mod.json]] 文件 ''%%"depends"%%'' 块中加入 ''%%"fabric-key-binding-api-v1": "*"%%''。
添加按键绑定很简单,只需要:
* 打开或者创建一个客户端[[zh_cn:documentation:entrypoint|入口点]]
* 创建按键绑定对象
* 键按下时作出反应
[[https://github.com/FabricMC/fabric/blob/1.16/fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java|这里]]有更新的实例。
==== 准备入口点 ====
如果你已经创建好了客户端的入口点,而且明白它的工作原理,可以放心快进到[[#Creating your Keybind|下一部分]]。否则接着了解一下。
想要创建客户端入口点,需要先做几件事,来让 Fabric 知道我们想要写一些只需要在物理客户[[zh_cn:tutorial:side|侧]]执行的代码。简单示范一下,我们创建一个叫做 ''ExampleClientEntrypoint'' 的类,其实一般都会把这个类命名为“mod 名称”+“Client”,比如 ''YoYoDeleriumClient''、''HappySheepHammocksClient''。看一眼代码,然后我们解释一下发生了什么:
/* package */
/* imports */
public class ExampleClientEntrypoint implements ClientModInitializer {
// The KeyBinding declaration and registration are commonly executed here statically
@Override
public void onInitializeClient() {
// Event registration will be executed inside this method
}
}
那么,我们到底在干什么?大多数情况下,Fabric 的入口点是通过实现一个特殊的接口来指定的,这个接口只针对应该运行入口点中的代码的客户端或服务端。对于我们的客户端,只需让我们的类实现 “ClientModInitializer”接口。这个接口要求我们重写(“@Override”)“onInitializeClient”这个方法。正是在这个方法(以及其他入口点的对应方法)中,我们会经常调用 Fabric API 提供的方法,以方便注册和添加我们可能希望在 mod 中拥有的一些对象和行为。当然,我们还需要更新 ''fabric.mod.json'',以包括新创建的入口点,所以如果你需要复习这个过程,请务必查阅[[zh_cn:documentation:entrypoint|入口点]]页面。
==== 创建按键绑定 ====
在你喜欢的地方声明:
private static KeyBinding keyBinding;
FabricKeyBinding 有一个用于初始化的 Builder。它需要 Identifier、InputUtil.Type、按键编码和绑定类别作为参数:
keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"key.examplemod.spook", // The translation key of the keybinding's name
InputUtil.Type.KEYSYM, // The type of the keybinding, KEYSYM for keyboard, MOUSE for mouse.
GLFW.GLFW_KEY_R, // The keycode of the key
"category.examplemod.test" // The translation key of the keybinding's category.
));
需要粘滞键的话,加上 ''() -> true'' 作为最后一个参数。
''GLFW.GLFW_KEY_R'' 可以用任意你想要绑定默认的键替代。类别与设置页面中按键绑定的分组相关。
==== 对按键绑定作出反应 ====
下面的代码会在聊天栏里显示“Key 1 was pressed!”。
ClientTickEvents.END_CLIENT_TICK.register(client -> {
while (keyBinding.wasPressed()) {
client.player.sendMessage(new LiteralText("Key 1 was pressed!"), false);
}
});
请注意,这些完全是客户端的事情。要让服务器响应一个按键绑定,你需要发送一个自定义数据包,让服务器另外处理。