Keylisteners / Actionlisteners与Timer无法正常工作

时间:2012-04-12 16:11:08

标签: java swing actionlistener keylistener

我正在编写一个游戏,我正在使用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

1 个答案:

答案 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等)。这应该足以使运动看起来很自然。