문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 마인크래프트/모드/개발 (문단 편집) == 키 바인딩(조작키 추가) == 마인크래프트 내 입력이 감지될 때 {{{InputEvent.KeyInputEvent}}}가 발생한다. 따라서 이 이벤트의 리스너를 등록하면 키보드 입력을 받을 수 있다. 하지만 해당 이벤트의 메소드로는 입력된 키를 받기만 할 수 있고 키가 처음 눌렸는지 등의 세부적인 정보는 알 수 없다. 또한 위 이벤트의 리스너만 등록하게되면 키 바인딩을 게임 내에서 수정하기 불편해지며, 설정한 키가 수행하는 역할을 게임 내에서 알기도 어렵다. 따라서 일반적으로 특정 키의 역할과 카테고리를 저장하는 {{{KeyBinding}}} 클래스의 인스턴스를 등록하여 사용한다. {{{KeyBinding}}} 클래스의 생성자는 다음과 같다. {{{#!syntax java public KeyBinding(String description, int keyCode, String category) }}} 각 파라미터는 다음의 역할을 한다. {{{ description : 키가 눌렸을 때 어떤 일을 수행하는지 알려준다. 다른 모드와의 중복을 피하기 위해 <모드 아이디>.key.<이름>으로 짓는 것이 좋다. 이름은 다른 오브젝트의 이름과 마찬가지로 소문자와 언더바를 사용한다. keyCode : 해당하는 키의 코드이다. org.lwjgl.glfw 패키지 내의 GLFW 클래스에 정의되어 있는 것을 사용한다. category : 해당 키 바인딩의 카테고리이다. 같은 카테고리를 가진 키 바인딩은 마인크래프트 설정 내에서 같은 카테고리에 묶이게 된다. key.categories.<모드 아이디>.<세부 카테고리>로 짓는 것이 좋다. }}} 예를 들어 J키를 눌렀을 때 현재 플레이어의 장소를 스폰 포인트로 지정하는 역할을 하게 하고 싶다면 다음의 인스턴스를 만들면 된다. {{{#!syntax java import net.minecraft.client.settings.KeyBinding; import static wiki.namu.mymod.NamuMain.MODID; import static org.lwjgl.glfw.GLFW.*; //... public static final KeyBinding SET_SPAWN = new KeyBinding(MODID + ".key.set_spawn", GLFW_KEY_J, "key.categories." + MODID); }}}또다른 키 바인딩을 같은 카테고리로 묶고 싶다면 {{{category}}}로 같은 문자열을 넘겨주면 된다. {{{#!syntax java public static final KeyBinding KILL = new KeyBinding(MODID + ".key.kill", GLFW_KEY_K, "key.categories." + MODID); }}} 키 바인딩을 만들었으면 레지스트리에 등록해줘야 한다. 키 바인딩이나 입력 등은 클라이언트 사이드에서만 행해져야 하는 작업이기 때문에 메인 클래스 내의 {{{FMLClientSetupEvent}}} 리스너 내에서 등록해야 한다. 등록은 {{{ClientRegistry.registerKeyBinding()}}} 메소드로 한다. {{{#!syntax java private void clientRegistries(final FMLClientSetupEvent event) { LOGGER.info(Logging.LOADING, "Client setup method registered"); ClientRegistry.registerKeyBinding(SET_SPAWN); ClientRegistry.registerKeyBinding(KILL); } }}} 그 다음 {{{InputEvent.KeyInputEvent}}}의 리스너에서 키 바인딩의 인스턴스의 {{{isKeyDown()}}} 또는 {{{isPressed()}}} 메소드를 호출하여 해당 키가 눌렸는지 확인할 수 있다. 둘의 차이점은 {{{isKeyDown()}}}은 키가 눌려있는 상태면 항상 {{{true}}}를 반환하지만, {{{isPressed()}}}는 키가 눌린 시점에만 {{{true}}}를 반환한다. 주의할 점은 위 이벤트는 클라이언트 사이드에서만 처리되어야 하기 때문에 리스너에 {{{@OnlyIn(Dist.CLIENT)}}} 어노테이션을 붙여야 한다. 그러므로 명령어 실행 등 서버 사이드에서 실행되는 작업을 직접 리스너 내에서 할 수 없다. 서버 사이드에서 실행되어야 하는 작업은 서버에 패킷을 보내는 방식으로 처리해야 한다. {{{#!syntax java package wiki.namu.mymod.input; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import wiki.namu.mymod.NamuMain; import static wiki.namu.mymod.input.NamuKeyBindng.SET_SPAWN; import static wiki.namu.mymod.input.NamuKeyBindng.KILL; @Mod.EventBusSubscriber(modid = NamuMain.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class NamuKeyInputHandler { public static final Logger LOGGER = LogManager.getLogger(); public static final Marker INPUT = MarkerManager.getMarker("INPUT"); @OnlyIn(Dist.CLIENT) @SubscribeEvent(receiveCanceled = true) public static void onKeyInput(InputEvent.KeyInputEvent event) { if(SET_SPAWN.isPressed()) { LOGGER.debug(INPUT, "Key binding = " + SET_SPAWN.getKeyDescription()); // 해당하는 키가 눌렸을 때 수행할 작업을 여기에 작성 // 명령어 수행 등 서버 사이드에서 수행되어야 할 작업은 서버에 패킷을 보내서 수행 } if(KILL.isPressed()) { LOGGER.debug(INPUT, "Key binding = " + KILL.getKeyDescription()); } } } }}} 마지막으로 키 바인딩의 카테고리와 설명이 게임 상에서 보이는 이름을 lang 패키지 내에 설정해줘야 한다. 이 때, 프로퍼티의 이름은 {{{KeyBinding}}} 클래스의 생성자에 넣어준 문자열 그대로 하면 된다. {{{#!syntax json { "key.categories.modnamu": "Namu Mod", "modnamu.key.set_spawn": "Set Spawnpoint", "modnamu.key.kill": "Suicide" } }}}{{{파일 이름 : assets/modnamu/lang/en_us.json}}} 실행 시 마인크래프트 설정 내 조작에 들어가 보면 다음과 같이 키 바인딩이 추가된 것을 볼 수 있다. [[파일:2019-07-19_23.28.38.png]] 또한 해당하는 키를 누를 때마다 콘솔 창에 다음 메시지가 뜨는 것을 볼 수 있다. {{{ [23:29:12.030] [Client thread/DEBUG] [wi.na.my.in.NamuKeyInputHandler/INPUT]: Key binding = modnamu.key.set_spawn [23:29:13.013] [Client thread/DEBUG] [wi.na.my.in.NamuKeyInputHandler/INPUT]: Key binding = modnamu.key.kill }}}저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기