我正在开发一个简单游戏的程序,我们被告知添加类似开始菜单的东西。我让游戏单独运行到我点击运行的地方,游戏在一个窗口中拉起来,但现在我需要添加开始菜单,我很难做到并且不知道如何获取它工作正常。我正在做的游戏是小行星。
我现在拥有的方式是游戏从一开始就出现在JFrame上。由于游戏从一开始就出现,我尝试制作一个JButton
,当点击时初始化一个布尔变量的值,该变量确定游戏的状态等于true。这是我得到的代码:
public Asteroids()
{
ast = new ArrayList<Asteroid>();
aliveAsteroids = NUM_ASTEROIDS;
bullets = new Bullet[NUM_BULLETS];
ship = new Ship();
g2d = null;
gameButton = new JButton("Start");
gameButton.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
gameRunning = true;
}
});
JPanel buttonPanel = new JPanel (new FlowLayout());
buttonPanel.add(gameButton);
frame = new JFrame("Asteroids");
identity = new AffineTransform();
rand = new Random();
frame.setSize(FRAMEWIDTH, FRAMEHEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(buttonPanel);
frame.add(this);
frame.setVisible(true);
}
public static void main(String [] args)
{
Asteroids game = new Asteroids();
if(gameRunning == true)
{
game.go();
}
}
public void go()
{
//set up the ship
ship.setX(FRAMEWIDTH / 2);
ship.setY(FRAMEHEIGHT / 2);
//set up the bullets
for (int n = 0; n < NUM_BULLETS; n++)
{
bullets[n] = new Bullet();
}
//set up the asteroids
for (int n = 0; n < NUM_ASTEROIDS; n++)
{
Asteroid a = new Asteroid();
a.setX((double)rand.nextInt(FRAMEWIDTH)+20);
a.setY((double)rand.nextInt(FRAMEHEIGHT)+20);
a.setMoveAngle(rand.nextInt(360));
double ang = a.getMoveAngle() - 90;
a.setVelX(calcAngleMoveX(ang));
a.setVelY(calcAngleMoveY(ang));
ast.add(a);
}
addKeyListener(this);
requestFocusInWindow();
gameloop = new Thread(this);
gameloop.start();
}
由于某种原因,这不符合我想要的方式,我不明白为什么。我试过的一些事情会给我一个NullPointerException
。为了记录,我知道NullPointerException
是什么以及它对null
的意义是什么,但我不知道为什么我在这个例子中得到一个。我尝试的其他东西拉起框架,但它甚至没有任何东西,即使它应该有一个按钮,也会抛出一堆异常。
编辑:显示的例外是Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at game.Asteroids.drawBullets(Asteroids.java:176)
at game.Asteroids.paintComponent(Asteroids.java:148)
我的另一个问题是关于frame.add(this)
的行。究竟是什么this
?我知道this
是一个关键字,可用于初始化与参数同名的实例变量,例如this.width = width;
。但是当我在这种情况下单独看到this
时,我不知道它指的是什么。那么整条线就在那里,我不知道它的作用。我所知道的是,它为框架添加了一些东西。那是什么东西超出了我。
我想知道是否有人可以帮我解释一下发生了什么以及为什么我的程序工作不正常并且可能会提供一些关于如何走上正确轨道的建议/提示?我非常感谢任何帮助。