移动精灵的键盘侦听器无法在Java

时间:2018-04-22 13:33:34

标签: java user-interface keylistener

我正在制作一个用于GUI项目的经典太空射击游戏,使用JPanels和swing等。我有一个多层主菜单,带有一个播放和退出按钮等,但是,我遇到的问题是在我的DrawPanel类绘制游戏的所有图形。这个类有一个巨大的绘画组件方法,每500毫秒在一个计时器上激活,并在背景上渲染闪烁的星星,渲染宇宙飞船,并渲染掉落的敌人。星星闪烁,敌人正在下降,但宇宙飞船根本没有移动,我必须使用“a”和“d”键。问题:我怎么能移动船?下面是一个非常概括的版本为了保持简单,渲染类,paint组件类充满了其他东西,包括生成闪烁的星星。

 public DrawPanel(int x, int y) 
{
t = new Timer(500, new ActionListener(){@Override public void actionPerformed (ActionEvent event){repaint();}});

this.addKeyListener(new KeyAdapter()
    {
        @Override public void keyPressed(KeyEvent e) { ship.keyPressed(e);System.out.println("keypressed");}
        @Override public void keyReleased(KeyEvent e) { ship.keyReleased(e);System.out.println("keyreleased");}
    });
t.start();
}

public void paintComponent(Graphics Graphic)
{
    super.paintComponent(Graphic);
      drawShip(Graphic);
    drawEnemy(Graphic,10);

}

private void drawShip(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

    g2d.drawImage(ship.getImage(), ship.getX(), 
        ship.getY(), this);
}

这是由drawship方法调用的太空船类,它解释了前一代码中变量“ship”的调用。(注意:任何东西都没有编译器错误或运行时错误)

public class Spaceship {
private int x = 780;
private int y = 850;
private Image image;

public Spaceship() 
{

   ImageIcon ii = new ImageIcon("spaceship.png");
    image = ii.getImage(); 

}

 public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key ==KeyEvent.VK_A) {
        x += -10;
    }

    if (key == KeyEvent.VK_D) {
        x+= 10;
    }


}

public void keyReleased(KeyEvent e) 
   {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_A) {
        x += 0;
    }

    if (key == KeyEvent.VK_D) {
        x += 0;
    }


    }
 }

我的思考过程就是键盘会一直处于活动状态,只要它注册了一个按键,它就会修改一个x,这样下次绘制船时它就会处于不同的位置。然而它会被敌人和背景绑定的同一时间绑定,并且在我想到它的时候不会流畅地左右移动,但是我不知道如何制作单独的绘画组件,计时器和重绘因为这是我所知道的唯一绘画方式。也 我确实意识到我没有对船舶运动进行严格的检查,但这不应该是一个问题,因为它甚至没有移动一厘米,更不用说超出范围,甚至不打印调试语句在听众中。 通过将所有类添加到main方法的默认构造函数中,我的所有类都被添加到已绑定到主菜单中的按钮和选项卡的面板中,因此这就是整个游戏的执行方式:

public static void main(String[] args) throws IOException
{
 GalagaRipOff main = new GalagaRipOff();
}

0 个答案:

没有答案