我最近开始尝试学习Java。我以为制作小型游戏可能是熟悉Java的最好方法,所以这就是我正在做的事情。所以,我开始了我的第一场比赛,看起来不错。它只是一个以玩家为中心的网格。一旦我尝试增加玩家的动作,我意识到我需要一个游戏循环来检查按键。那就是我尝试过的。我只能说我从未做过游戏循环,所以这就是我尝试过的事情:
public static void main(String[] args) {
GamePanel panel = new GamePanel();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGui();
double ns = 1000000000.0 / 60.0;
double delta = 0;
long lastTime = System.nanoTime();
long timer = System.currentTimeMillis();
while (true) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
panel.checkKeys();
delta--;
}
}
}
});
}
这是问题所在...运行此命令时,我的游戏崩溃了。它甚至不让我退出游戏。到底是怎么回事?以防万一,我将显示更多的GamePanel
代码(请告诉我是否需要更多代码)。
public GamePanel() {
setLayout(new GridLayout(tiles_count,tiles_count));
setBackground(Color.gray);
setfocusable(true);
addKeyListener(this);
tile_size = 40;
}
@Override
public void keypressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("A pressed");
player.x += 40;
left = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("A RELEASED");
left = false;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
public void checkKeys() {
if(left) {
System.out.println("LEFT");
} else {
System.out.println("!LEFT");
}
}
游戏结构如下:我有一个Main
类,它运行一个GamePanel
类作为main(String args) {}
函数。该问题可能与以下事实有关:即时消息是在run
类而不是Main
类中使用GamePanel
方法。
我究竟做错了什么?非常感谢您的帮助!