Posted March 16, 201510 yr I'm going to be making an interactive game in a gui, but I need to be able to use the vanilla keybindings (like 'right', 'left' etc). I've tried detecting when one of those keys is pressed, but it's always false. Here's what I've tried: public class GuiGame extends GuiScreen { public GuiGame() { } @Override public void updateScreen() { //Always false, doesn't print if (mc.gameSettings.keyBindForward.isPressed()) { System.out.println("Forward pressed"); } } @Override public boolean doesGuiPauseGame() { return false; } @Override public void drawScreen(int arg0, int arg1, float arg2) { drawDefaultBackground(); } } Is there something wrong with what I'm doing? Please help me if you know anything, I've been searching for 2 days!
March 16, 201510 yr protected void keyTyped(char chr, int id) {} Look at GuiScreen - A LOT of helper methods there. 1.7.10 is no longer supported by forge, you are on your own.
March 16, 201510 yr Do you mean when someone is holding a key down? Don't make mods if you don't know Java. Check out my website: http://shadowfacts.net Developer of many mods
March 16, 201510 yr Look at GuiScreen - A LOT of helper methods there. Just look... e.g isShiftKeyDown() 1.7.10 is no longer supported by forge, you are on your own.
March 16, 201510 yr Author Do you mean when someone is holding a key down? Yes! But key input seems to cease to work when a GUI is open. So, say I wanted to move a button while the up key is pressed. How would I do that?
March 16, 201510 yr Author I think I may have found a solution to my problem. In the handleKeyboardInput method of guiscreen it does a test for when you press the fullscreen button (F11) in the gui. I assume that putting my key input in this method would be the 'proper' way?
March 17, 201510 yr there are other functions you can use too, check the following classes org.lwjgl.input.Keyboard; org.lwjgl.input.Mouse; they are both available to use however the GUI uses them to so don't expect the events to work but you probably wont need them
March 17, 201510 yr I personally think you shouldn't go further than handleKeyboardInput, even that is really far (it's the top-generic method in mc Gui handling), going straight to lwjgl breaks the idea of using API/ready-code. If handleKeyboardInput will work for you then it's a right way to do it, if not (the "But key input seems to cease to work when a GUI is open"). Other than that you can hook yourself into InputEvent.KeyInputEvent: Minecraft mc = Minecraft.getMinecraft(); if (key.isPressed() && FMLClientHandler.instance().getClient().inGameHasFocus) { if (//check if mc.currentScreen == YourGuiClass) { // set some static value to true inside YourGuiClass } } Now you can use that static boolean inside your gui as a reassurance that key has ben clicked. Obviously to set it back to false you can use KeyBinding to do so (idk, there is probably method onUnpressed() or similar, idk, not in IDE). This way (with event) you will stay with universal KeyBinding (that are settled inside options menu), not static ones. EDIT: PS: I totally don't remember methods in KeyBinding right now, the ones above are jus tgeneral idea. Doing it is matter of looking there, 1.7.10 is no longer supported by forge, you are on your own.
March 17, 201510 yr if you only want to know if a key has been pressed you can use @Override protected void keyTyped(char p_73869_1_, int p_73869_2_) { // TODO Auto-generated method stub super.keyTyped(p_73869_1_, p_73869_2_); } and you can also use @Override public void handleKeyboardInput() { // TODO Auto-generated method stub super.handleKeyboardInput(); } but as far as i can see there are no function that test to see if a key is actually held down KeyBinding can be used to allow the client to set the keys to be used KeyBinding.getIsKeyPressed() and KeyBinding.isPressed() however these may not work while a gui is open ,
March 17, 201510 yr Author but as far as i can see there are no function that test to see if a key is actually held down That would be the second function you posted Other than that you can hook yourself into InputEvent.KeyInputEvent Thanks, I will check it out
March 17, 201510 yr I think for this particular use case (a minigame in a GUI) it is okay to go up to something like the Keyboard class and use the isKeyDown() method or similar. Since a minigame is basically intended to take over for a while it seems that it should be okay to intercept early on before processing through the Minecraft key processing. Check out my tutorials here: http://jabelarminecraft.blogspot.com/
March 18, 201510 yr Author Oh hi jabelar Thanks again for helping me, I needed to know whether it was reasonable to use lwjgl directly for this. I guess it's the only way!
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.