所以我基本上是在用java创建一个平台游戏。这里有一个简单的问题。我可以同时响应两个不同的KeyEvents吗?例如,我按下右箭头键,我的球员正在向右移动。现在,我希望我的球员能跳起来,但要一直向右移动。为此,我需要同时响应两个不同的KeyEvents。我该如何做到这一点?我还没有尝试任何代码,因为我不知道从哪里开始。谢谢你提前回答。
您可以使用单独的"KeyDown"one_answers"KeyUp"事件,并为您的玩家设置状态值。
你需要一个状态机为你的球员。
public class KeyboardListener extends JFrame implements KeyListener {
public KeyboardListener() {
addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key pressed");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left key pressed");
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key Released");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left key Released");
}
}
public static void main(String[] args) {
new KeyboardListener();
}
}
使用KeyListener界面中的keyPressed和keyReleased EventHandlers,并将当前玩家状态(如行走、跳跃、行走左、行走右等(保存为布尔值。
在你的主循环中,你可以检查你的玩家处于什么状态,并改变它的坐标。类似:
if(player.left) { player.x += speed } //etc.
您可能想要使用Threads,然后将按下的键添加到播放器物理类的列表中。
public class KeysListener implements KeyListener
...
//FIRST THREAD
new Thread(new Runnable() {
@Override
public void run() {
public void keyEvent(KeyEvent e) {
int key = e.getKeyCode();
//TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSYICS
}
}
}).start();
//SECOND THREAD
new Thread(new Runnable() {
@Override
public void run() {
public void keyEvent(KeyEvent e) {
int key = e.getKeyCode();
//TODO ADD KEY TO A LIST IN THE CLASS THAT HANDLES YOUR PHYSICS
}
}
}).start();
...
}
根据您需要的同时键的数量添加任意数量的线程。