我正在用 java 制作 2D 游戏。
在游戏中,按左右箭头键可旋转 Sprite 并操纵名为“角度”的变量。按向上箭头键,根据“角度”变量计算 Sprite 应该移动的方向。
这可行,但我无法在移动时操纵角度,也就是在按下向上箭头的同时按下左键或右键。
按向上箭头会使程序忽略按下箭头键之一的事实。
我搜索了论坛并找到了一个如何处理该问题的建议,但我不确定它是否最适合我的程序。 (我发现了什么:How do I handle simultaneous key presses in Java?)
这是一些代码:
Thing
类的相关方法:
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if(key==KeyEvent.VK_LEFT){ setAngle(getAngle()-5);
leftPressed=true; // *new* }
if(key==KeyEvent.VK_RIGHT)setAngle(getAngle()+5);{
rightPressed=true; // *new* }
if(key==KeyEvent.VK_UP){
dy = (float) ( Math.sin( getAngle() ) ) * 5;
dx = (float) ( Math.sin( 90-getAngle() ) ) * 5;
if(leftPressed==true)angle-=5; // *new*
if(rightPressed==true)angle+=5; // *new*
}
public void move(){
x += dx;
y += dy;
}
}
Board
类(管理游戏的类:)
打包learningMovement;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
public class Board extends JPanel implements ActionListener, KeyListener {
Thing t;
Timer timer;
public Board(){
setBackground(Color.BLACK);
timer = new Timer(10,this);
t = new Thing();
setFocusable(true);
timer.start();
addKeyListener(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.rotate( Math.toRadians(t.getAngle()), t.getX() + (t.getWidth()/2), t.getY() + (t.getHeight()/2) );
g2d.drawImage(t.getImage(),(int)t.getX(),(int)t.getY(),this);
}
public void actionPerformed(ActionEvent e){
t.move();
repaint();
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key==KeyEvent.VK_LEFT)t.keyPressed(e);
if(key==KeyEvent.VK_RIGHT)t.keyPressed(e);
if(key==KeyEvent.VK_UP)t.keyPressed(e);
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if(key==KeyEvent.VK_LEFT)t.keyReleased(e);
if(key==KeyEvent.VK_RIGHT)t.keyReleased(e);
if(key==KeyEvent.VK_UP)t.keyReleased(e);
}
public void keyTyped(KeyEvent arg0) {}
}
我该如何解决这个问题?谢谢
最佳答案
KeyListener
只会引发一个事件。这意味着,每当 keyPressed
被调用时,它代表一个单一的按键事件。
相反,您需要做的是,在每次触发 keyPressed
时,您需要设置一个标志,指示按下了哪个键。当keyReleased
被触发时,需要重新设置flag。
然后您需要一种方法来处理这些标志并根据这些标志的状态决定要做什么...
最后避免 KeyListener
,这是一个很难处理的焦点问题。相反,我建议您使用 Key Bindings相反
例如……
关于java - 在 Java 游戏中,按下一个键会取消仍然按下的另一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20867279/