这样的事情会成为可能吗? 我知道有Gdx.input.isKeyPressed(int key)。
public class KeyListener implements EventListener {
public boolean handle(Event e) {
if (!(e instanceof InputEvent)) return false;
InputEvent event = (InputEvent) e;
if (event.getType() == InputEvent.Type.keyDown) keysPressed(event.getKeyCode(), keycode????)
}
public boolean keysPressed(int firstKey, int secondKey) {
}
}
编辑:如何返回第二个keyCode? p>
答案 0 :(得分:2)
如果你想在没有任何监听器的情况下检查所有按下的键,最简单的解决方案是使用 Gdx.input.isKeyPressed 方法并将密钥的所有整数标识符传递给它。
在 Input.Keys 类中,列出了所有键,例如:
public static final int I = 37;
public static final int J = 38;
public static final int K = 39;
public static final int L = 40;
...
你可以看到一个键的最大值是255(BUTTON_CIRCLE),所以我们将从0-255迭代检查键是否被按下。然后将按下的键的id添加到数组中,并检查是否存在所需的组合。
总而言之,代码应如下所示:
//this should not be in the render function!
Array<Integer> pressedButtons = new Array<Integer>();
...
//this should be in the render function
pressedButtons.clear();
for(int i = 0; i < 256; i++)
if( Gdx.input.isKeyPressed( i ) )
pressedButtons.add( i );
if(pressedButtons.contains(Keys.CONTROL_LEFT, false) && pressedButtons.contains(Keys.ALT_LEFT, false) && pressedButtons.contains(Keys.M, false))
{
System.out.println("PRESSED!");
}
你可以在if上添加一些标志,只会被触发一次
答案 1 :(得分:2)
在我输入这个答案之前,我没有注意到另一个答案,但这种方法有一些优点。它使用一个InputProcessor,如果你需要与其他输入处理器和Stage2D玩得很好,这是正确的方法;你不必每帧迭代255个键;并且每次按键时它只会触发一次而不是每一帧。
没有自动处理多个按键的方法,但实现自己的按键非常简单。 Libgdx附带了一个IntSet类,它非常适合这种情况,并且因为它使用原始int而避免生成垃圾。
private final IntSet downKeys = new IntSet(20);
private InputAdapter inputAdapter = new InputAdapter(){
public boolean keyDown (int keycode) {
downKeys.add(keycode);
if (downKeys.size >= 2){
onMultipleKeysDown(keycode);
}
return true;
}
public boolean keyUp (int keycode) {
downKeys.remove(keycode);
return true;
}
};
private void onMultipleKeysDown (int mostRecentKeycode){
//Keys that are currently down are in the IntSet. Do whatever you like, for example:
//Alt-F4 to quit:
if (downKeys.contains(Input.Keys.ALT_LEFT) || downKeys.contains(Input.Keys.ALT_RIGHT)){
if (downKeys.size == 2 && mostRecentKeycode == Input.Keys.F4){
Gdx.app.exit();
}
}
}
@Override
public void show() {
downKeys.clear();
Gdx.input.setInputProcessor(inputAdapter);
}
答案 2 :(得分:1)
这是捕获按键组合的一种方法,这适用于名为JMenuItem
的特定mniPrefUnlimitedReuse
:
mniPrefUnlimitedReuse.setAccelerator(getKeyStroke(VK_U,
SHIFT_DOWN_MASK | CTRL_DOWN_MASK));
当用户按下Ctrl-Shift-U
时,菜单项会起作用。
你可能还需要一些像这样的代码,这是我为应用程序编写的实际代码的一部分:
private void cellsKeyPressedAction(KeyEvent e)
{
int key = e.getKeyCode();
int mods = e.getModifiers();
if(key == VK_DELETE || key == BKSP || key == VK_SPACE)
... do same thing if the delete, backspace or space bar is hit ...
if((mods & CTRL_MASK) == CTRL_MASK) ctrlIsDown = true ;
if((mods & SHIFT_MASK) == SHIFT_MASK) shiftIsDown = true;
if(ctrlIsDown && shiftIsDown && key == VK_V)
... do something when user presses `Ctrl-Shift-V` ...
if( ctrlIsDown
&& key > 0
)
... do something if user presses, e.g., `Ctrl-A` among others ...
要为名为cells
的对象调用该代码,KeyListener
需要keyPressed
:
cells.addKeyListener(new KeyListener() {
public void keyPressed (KeyEvent e)
{
cellsKeyPressedAction(e);
}
});
<强> 修改 强>
鉴于你想使用libgdx
来做,肯定逻辑和调用是相似的。例如,我在github的libgdx/libgdx
下tests/gdx-tests-lwjgl/src/com/badlogic/gdx/tests/lwjgl/LwjglTestStarter.java
找到的内容看起来像纯Java
。我不知道你是否可以找到libgdx
的类似例程 - 你为什么要这样做?
list.addKeyListener(new KeyAdapter() {
public void keyPressed (KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER)
... do something ...
}
});
我没有使用libgdx
的经验,因此我不知道需要更换Java
例程以检查按键操作。
也许谷歌?
编辑2
喔。 &#34;没有java&#34;例程。但为什么?我想我表现出了无知。但我想这就是原因:
The libgdx project is an open-source cross-platform game development library written in Java. It abstracts away the differences between writing OpenGL-based games on various platforms.
This link可能有所帮助。绝对是this tutorial。并且this。 And this。 And finally
再一次,我想一旦你学会了什么样的惯例&#39;名称是,keysPressed
方法看起来很像我的Java
例程,只是名称和参数列表略有不同。
编辑3
public boolean keyDown(int keycode) {
boolean ctrl, alt, shift, ...;
if (Gdx.input.isKeyPressed(Input.Keys.LEFT_SHIFT) || Gdx.input.isKeyPressed(Input.Keys.RIGHT_SHIFT)) {
shift = true;
}
if (Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT) || Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT))) {
ctrl = true;
}
if( Gdx.input.isKeyPressed(Input.Keys.ALT_LEFT) || Gdx.input.isKeyPressed(Input.Keys.ALT_RIGHT))) {
alt = true;
}
// Finally, choose an action based on the key combination pressed
if (shift && keycode == Input.Keys.A) {
// What to do if Shift+A is pressed
} else if (/* and so on */) {
//...
}
}