我正在制作一个用于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();
}