我正在开发一个简单的 2D 游戏,其中包含两个玩家。我用 W、A、S 和 D 键移动玩家 1。其他玩家由箭头键控制。
我面临的问题是,当按住任何箭头键移动玩家 2 时,W、S、D 和 A 键对玩家 1 有效,反之亦然。
我看到过一些答案,例如 this ,但这并没有解决我的问题。
我有一个主类 Gameplay 并制作了两个内部类 Player1Listener 和 Player2Listener (实现 KeyListener)。
下面显示了一个类的示例代码,其他子类看起来相同。
private class Player1Listener implements KeyListener
{
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_W)
{
player1right = false;
player1left = false;
player1down = false;
player1up = true;
player1Y-=10;
}
if(e.getKeyCode()== KeyEvent.VK_A)
{
player1right = false;
player1left = true;
player1down = false;
player1up = false;
player1X-=10;
}
if(e.getKeyCode()== KeyEvent.VK_S)
{
player1right = false;
player1left = false;
player1down = true;
player1up = false;
player1Y+=10;
}
if(e.getKeyCode()== KeyEvent.VK_D)
{
player1right = true;
player1left = false;
player1down = false;
player1up = false;
player1X+=10;
}
}
}
我在 Gameplay 构造函数中添加这些关键监听器,例如
addKeyListener(new player1Listener());
最佳答案
private final Set<Character> Keyspressed = new HashSet<Character>();
public void keyPressed(KeyEvent e){
pressed.add(e.getKeyChar());
if (Keyspressed.size() > 1) {
//size is greator than one which means you
//have pressed more than one key.
//now your set contains all pressed keys. iterate it and fine out which was pressed.
foo(Keyspressed);
}
}
public void foo(Set<Character> Keyspressed){
boolean Apressed = false;
boolean Wpressed = false;
boolean Spressed = false;
boolean Dpressed = false;
for(Character e : Keyspressed){
if(e==KeyEvent.VK_A){
Apressed = true;
}else if(e==KeyEvent.VK_S){
Spressed = true;
}else if(e==KeyEvent.VK_D){
Dpressed = true;
}else if(e==KeyEvent.VK_W){
Wpressed = true;
}
}
if(Apressed && Spressed){
//your logic
}
}
您可以将所有按下的按键添加到 set<Character>
中并实现一个函数来迭代按下的按键。
关于java - java中同时按下两个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393516/