我正在编写一个游戏,我正在使用Java的Swing。现在我正在努力让KeyListeners和Action监听器工作。
我要做的是让我的对象根据我按下的键移动。 (左,右,上,下),但由于某些原因,当我按下这些键中的任何一个时没有任何反应,但当我同时按下它们中的3个时。对象奇怪地向左移动..
所以这是我创建Runner对象的类的代码:
import java.awt.*;
public class Runner{
private int xpos, ypos, base, side;
public Runner(int b, int h ) {
base = b;
side = h;
}
public void setPosition(int x, int y){
xpos = x;
ypos = y;
}
public void view(Graphics g) {
int x[] = { xpos, xpos-base/2, xpos + base/2};
int y[] = { ypos, ypos + side, ypos + side };
g.setColor(Color.lightGray);
g.fillPolygon( x, y, 3 );
g.setColor(Color.darkGray);
g.drawLine(xpos, ypos, xpos, ypos + side);
}
public void shoot(Graphics g){
g.setColor(Color.red);
g.drawLine(xpos,ypos, xpos, 0);
}
}
这就是那些该死的东西的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RunningGame extends JPanel implements KeyListener, ActionListener{
Runner rs;
int x,y;
Timer t;
boolean shot = false;
boolean left = false, right = false, up = false, down = false;
public RunningGame() {
x = 100;
y = 150;
rs = new Runner(40,60);
rs.setPosition(x,y);
this.addKeyListener(this);
this.setBackground(Color.black);
t = new Timer(40, this);
t.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
rs.view(g);
if(shot) rs.shoot(g);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 37) {left = true;}
if (e.getKeyCode() == 39) {right = true;}
if (e.getKeyCode() == 38) {up = true;}
if (e.getKeyCode() == 40) {down = true;}
if (e.getKeyCode() == 32) {shot = true;}
rs.setPosition(x,y);
this.repaint();
}
public void keyReleased(KeyEvent e){
if (e.getKeyCode() == 37) left = false;
if (e.getKeyCode() == 39) right = false;
if (e.getKeyCode() == 38) up = false;
if (e.getKeyCode() == 40) down = false;
if (e.getKeyCode() == 32) shot = false;
this.repaint();
}
public void keyTyped(KeyEvent e){}
public void actionPerformed(ActionEvent e) {
if (left) {
if(right){
right = false;
x = x - 10; shot = false;
}
}
if (right) {
if(left){
left = false;
x = x + 10; shot = false;
}
}
if (up) {
if(down){
down = false;
y = y - 10; shot = false;
}
}
if (down) {
if(up){
up = false;
y = y + 10; shot = false;
}
}
rs.setPosition(x,y);
this.repaint();
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300); f.setLocation(100,100);
f.setTitle("Running");
RunningGame p = new RunningGame();
f.add(p); f.setVisible(true);
p.requestFocus();
}
}
(这不是最后的代码,它只是使用了一个宇宙飞船的例子,后来我会使用另一个对象,只是想测试KeyListener和ActionListener,所以它在继续之前有效。)
无论如何,任何人都可以帮我让太空船顺利移动吗?并且无需释放所有键以激活另一个键?即如果我保持向左,我希望它能够按下另一个按钮。所以,如果我向右按,太空船将开始向那个方向移动。
// MrElephants
答案 0 :(得分:2)
在看起来像这样的块中:
if (left) {
if(right){
right = false;
x = x - 10; shot = false;
}
}
我认为你应该在第二个x = x - 10;
之外if
:
if (left) {
if(right){
right = false;
shot = false;
}
x = x - 10;
}
虽然我不确定那个内在的if
是什么,也许你应该完全删除它(但保持x - = 10等)。这应该足以使运动看起来很自然。