====== Назначение клавиш ======
==== Назначение клавиш: с клавиатуры ====
Minecraft обрабатывает пользовательский ввод с периферийных устройств, таких как клавиатура и мышь, с помощью назначения клавиш. Когда вы нажимаете W, ваш персонаж движется вперёд, а когда вы нажимаете E, открывается ваш инвентарь. Назначение каждой клавиши может быть изменено в меню настроек, поэтому вы можете переназначить управление своим персонажем с WASD на стрелочки, если захотите.
В этом руководстве предполагается, что у вас есть Key Binding API, если нет — добавьте ''%%"fabric-key-binding-api-v1": "*"%%'' в блок ''%%"depends"%%'' в вашем файле [[ru:documentation:fabric_mod_json_spec|fabric.mod.json]].
Назначить новую клавишу несложно. Вам понадобится:
* открыть или создать [[ru:documentation:entrypoint|точку входа]] для клиента
* создать объект KeyBinding
* добавить обработку нажатия клавиши
Обновлённый пример см. [[https://github.com/FabricMC/fabric/blob/1.16/fabric-key-binding-api-v1/src/testmod/java/net/fabricmc/fabric/test/client/keybinding/KeyBindingsTest.java|здесь]].
==== Подготовка точки входа ====
Если у вас уже создана точка входа в клиент, и вы знакомы с тем, как она работает, вы можете смело переходить к [[#создание_вашей_привязки_ключей|следующему разделу]]. Если нет — оставайтесь с нами!
Чтобы создать точку входа для клиента, нам нужно будет выполнить несколько действий, чтобы дать Fabric знать, что мы хотим, чтобы определённый код выполнялся только на ([[ru:tutorial:side|стороне]]) физического клиента. Мы создадим краткий пример класса под названием ''ExampleClientEntrypoint'', но, как правило, такой класс называют "YourModName", за которым следует "Client", например ''YoYoDeleriumClient'' или ''HappySheepHammocksClient''. Давайте взглянем на код и разберёмся, что происходит:
/* package */
/* imports */
public class ExampleClientEntrypoint implements ClientModInitializer {
// Объявление и регистрация KeyBinding обычно выполняются здесь в статическом контексте
@Override
public void onInitializeClient() {
// Регистрация события будет выполнена внутри этого метода
}
}
Итак, что мы здесь делаем? Точки входа в структуру для большинства вариантов использования назначаются путем реализации специального интерфейса, уникального для стороны или сторон, на которых должен выполняться код в точке входа. Для нашего клиента у нас просто есть наш класс, реализующий интерфейс ''ClientModInitializer''. Интерфейс требует, чтобы мы поставили ''@Override'' на один метод, ''onInitializeClient''. Именно в этом методе (и эквивалентах из других точек входа соответственно) мы часто будем вызывать методы, предоставляемые Fabric API , для простой регистрации и добавления некоторых объектов и поведений, которые мы, возможно, пожелаем иметь в нашем моде. Конечно, нам также потребуется обновить наш ''fabric.mod.json'' , чтобы включить нашу недавно созданную точку входа, поэтому обязательно обратитесь к [[ru:documentation:entrypoint|странице точек входа]], если вам нужно обновить этот процесс.
==== Создание вашей привязки ключей ====
Объявите один из них в области, которую вы предпочитаете:
private static KeyBinding keyBinding;
FabricKeyBinding has a Builder for initialization. It takes in an Identifier, InputUtil.Type, key code, and binding category:
keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"key.examplemod.spook", // Ключ перевода имени привязки ключей
InputUtil.Type.KEYSYM, // Тип привязки клавиш, KEYSYM для клавиатуры, MOUSE для мыши.
GLFW.GLFW_KEY_R, // Ключевой код ключа
"category.examplemod.test" // Ключ перевода категории привязки ключей.
));
Если вам нужен фиксированный ключ, добавьте ''() -> true'' в качестве последнего параметра.
''GLFW.GLFW_KEY_R'' можно заменить любым ключом, который вы хотите, чтобы привязка была установлена по умолчанию. Категория связана с тем, как привязка клавиш сгруппирована на странице настроек.
==== Реакция на вашу привязку ключей ====
Приведенный здесь код выведет сообщение "Клавиша 1 была нажата!".
ClientTickEvents.END_CLIENT_TICK.register(client -> {
while (keyBinding.wasPressed()) {
client.player.sendMessage(new LiteralText("Клавиша 1 была нажата!"), false);
}
});
Имейте в виду, что это полностью на стороне клиента. Чтобы сервер ответил на привязку ключей, вам нужно будет отправить пользовательский пакет и попросить сервер обработать его отдельно.