Jump to content

[1.7.10] How do I use key bindings in a GUI?


hrb1658

Recommended Posts

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!

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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, :P

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

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 ,

 

 

 

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So I saw that mixin is shipped as a library with forge, but is it available for 1.7.10 ?  
    • So I've read the EULA, and lets be straight...     If I split my modpack(of my mods, yeah I'm nuts) into several(many) individual mods(like just one boss) with minor additions(plus not working together), then have a complete/modpack version on patreon/onlyfans having each addon work together... Would people buy my idea?
    • German A1 – C1, TestDAF, Goethe B1, B2, C1, C2, valid GOETHE certificate German A1 – C1, TestDAF, Goethe B1, B2, C1, C2, valid GOETHE certificate(+27(838-80-8170
    • Done, it still crashed. New log https://paste.ee/p/kYv6e
    • I am migrating a mod from 1.16.5 to 1.20.2 The version for 1.16.5 can be found here https://github.com/beothorn/automataCraft For the block called automata_start, it uses TileEntities and has blockstates, model/block and textures on json files. This is currently working fine on 1.16.5 https://github.com/beothorn/automataCraft/tree/master/src/main/resources/assets/automata For 1.20.2 I migrated the logic from TileEntities to BlockEntity. The mod is working fine. All blocks and Items are working with the correct textures except for the textures for each state of the automata_start block. No changes where made to the json files. This is the branch I am working on (there were some refactorings, but all is basically the same): https://github.com/beothorn/automataCraft/tree/1_20/src/main/resources/assets/automata The only difference I can think that may be related is that i had to implement createBlockStateDefinition on the BaseEntityBlock: https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/AutomataStartBlock.java#L43 This is driving me crazy. I know the jsons are being loaded as I put a breakpoint at `net.minecraft.client.resources.model.ModelBakery#loadModel` and I can see BlockModelDefinition.fromJsonElement being called with automata_start. I also printed the state from the arguments of the tick function call and they look correct (https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/Ticker.java#L32 ): blockState Block{automata:automata_start}[state=loadreplaceables] In game, all I see is the no textures. I think it is weird it is not the "missing texture" texture so I think it may be related to the material, but I had no success tweaking it (https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/AutomataStartBlock.java#L37).   public static final Property<AutomataStartState> state = EnumProperty.create("state", AutomataStartState.class); private final AtomicReference<RegistryObject<BlockEntityType<?>>> blockEntityType; private final Map<String, RegistryObject<Block>> registeredBlocks; public AutomataStartBlock( final AtomicReference<RegistryObject<BlockEntityType<?>>> blockEntityType, final Map<String, RegistryObject<Block>> registeredBlocks ) { super(BlockBehaviour.Properties.of().mapColor(MapColor.STONE).strength(1.5F, 6.0F)); this.blockEntityType = blockEntityType; this.registeredBlocks = registeredBlocks; this.registerDefaultState(this.getStateDefinition().any().setValue(state, AutomataStartState.LOAD_REPLACEABLES)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> stateBuilder) { stateBuilder.add(state); }     So my cry for help is, anyone has any ideas? Is there a way to easily debug this, for example somewhere where I can list the textures for a given state, or make sure this is loaded?   Thanks in advance for the hints
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.