【发布时间】:2018-02-26 14:36:04
【问题描述】:
我正在开发一个 Java Snake 游戏。大多数基本功能都已完成,我正在尝试添加一个重新启动功能,当您在游戏结束时按 ENTER 时将触发该功能。所有逻辑都正常工作,蛇重置到起始位置,苹果获得新的随机位置等。但由于某种原因,我的 JPanel 不会重新绘制。你们能不能看看我做错了什么。
我已经使用游戏循环、重置功能等从我的代码中制作了快照。如果您需要更多信息,请告诉我。
/*
* Main class, game loop, keyListener etc
*/
/*
* Here is my run method with game loop when gameOver, snake will no longer
* update.
*
*/
@Override
public void run() {
// game loop
while (running) {
if (!gameOver) {
update();
}
MainFrame.paint();
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* KeyListener, when ENTER is pressed call resetGame() method.
*/
if(key.getKeyCode()==KeyEvent.VK_ENTER && gameOver) {
resetGame();
}
/*
* resetGame method where I reset variables, create new default snake,
* clear JPanels etc.
*/
public void resetGame() {
score = 0;
snake.clear(); // clear arraylist
// .removAll() on both JPanels
MainFrame.clear();
// fields
gameOver = false;
newGame = true;
direction = Direction.RIGHT;
// create default snake
snake = new ArrayList<Point>();
size = 5;
for (int i = 0; i < size; i++) {
snake.add(new Point((size - i - 1) * MainFrame.getTileSize(), 0));
}
System.out.println(snake);
// create apple and set to random location
apple = randomApple();
}
/*
* MainFrame extends JFrame
* methods for repainting and clearing JPanels
*/
public static void paint() {
gamePanel.repaint();
sideHud.repaint();
}
public static void clear() {
gamePanel.removeAll();
sideHud.removeAll();
paint();
}
我的 JPanel 非常基础。我只是用 Graphics2D 对象在 paintComponent 方法中绘制所有内容。
这是我最近的解决方案(不起作用)。我也试过,离开游戏循环,然后在 resetGame() 方法中再次调用 run(),我尝试在按下 ENTER 时创建一个新的 Main 对象,但它们都不起作用。
提前致谢。
【问题讨论】:
-
If()是您声明的方法吗?因为Java关键字if是区分大小写的。 -
是的,很抱歉。我在这里添加了 if 语句,只是为了澄清。但我不小心输入了大写的 i。
-
I have also tried...- 你做错了什么。我们无法根据提供的代码告诉您问题所在。我建议您需要一个简单的方法,例如:playGame()。可以在您第一次玩游戏以及想要开始另一个游戏时调用此方法。此方法将负责设置游戏的属性,然后启动 Thead 玩游戏。因此,除了蛇和苹果的位置之外,还需要重置“running”和“gameOver”等变量。 -
代码太不完整,无法回答... MainFrame.paint() 是做什么的?清除()?等等。面板在哪里创建/重新创建,等等。