====== 自定义按键绑定 ====== ==== 键盘绑定:直接从键盘输入 ==== 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); } }); 请注意,这些完全是客户端的事情。要让服务器响应一个按键绑定,你需要发送一个自定义数据包,让服务器另外处理。