Ich versuche gerade libGdx zu lernen, indem ich das Tutorial aus dem Buch "Learning Libgdx Game Development" lese und einen seltsamen Fehler gefunden habe.Libgdx EXCEPTION_ACCESS_VIOLATION (0xc0000005)
Es gibt eine Funktion namens backToMenu:
private void backToMenu() {
// switch to menu screen
game.setScreen(new MenuScreen(game));
}
Sein Zweck ist einfach, das Spiel Bildschirm ito Bildschirm Hauptmenü ändern. Das Spiel startet auf dem MenuScreen, der zu GameScreen übergeht, ausgelöst durch den Benutzerklick. Sobald der Benutzer sich auf dem GameScreen befindet, hat er/sie zwei Möglichkeiten, um zurück ins MainMenu zu gelangen, entweder durch Drücken der Escape-Taste oder wenn der Spielzustand erreicht ist. Erstens durch die Escape-Taste getroffen, habe ich einfach für den Fall hören:
public boolean keyUp (int keycode) {
// Back to Menu
if (keycode == Input.Keys.ESCAPE)
backToMenu();
return false;
}
Die keyUp ist eine überschriebene InputAdapter Funktion. Dieser funktioniert ganz gut. Das Problem tritt auf die zweite Option:
public void update (float deltaTime)
{
handleDebugInput(deltaTime);
if (isGameOver()) {
timeLeftGameOverDelay -= deltaTime;
if (timeLeftGameOverDelay < 0)
{
//init();
backToMenu();
}
}
Der Code bedeutet einfach, nach „Game Over“ Nachricht für 3 Sekunden angezeigt wird, Benutzer wird automatisch in das Hauptmenü umgeleitet. Die Update-Funktion wird jedes Mal aufgerufen, wenn die Renderfunktion der Hauptspielschleife aufgerufen wird. Aber nachdem der Benutzer zum Hauptmenü zurück kommt und versucht, in Spielbildschirm wieder zu betreten, bekam ich folgende Fehlermeldung:
Ein schwerwiegender Fehler ist durch die Java Runtime Environment erkannt wurde:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77015d8b, pid=6184, tid=5856
JRE version: Java(TM) SE Runtime Environment (8.0_91-b15) (build 1.8.0_91-b15)
Java VM: Java HotSpot(TM) Client VM (25.91-b15 mixed mode windows-x86)
Problematic frame:
C [ntdll.dll+0x55d8b]
Seltsam, wenn Ich habe versucht zu simulieren, Benutzer drücken Escape-Taste statt direkt BackToMenu aufrufen, es funktioniert plötzlich! Der Anwender kann zwischen hin und her gehen Mainscreen -> GameScreen -> Gameover -> Mainscreen -> GameScreen just fine
public void update (float deltaTime)
{
handleDebugInput(deltaTime);
if (isGameOver()) {
timeLeftGameOverDelay -= deltaTime;
if (timeLeftGameOverDelay < 0)
{
//init();
try {
Robot robot = new Robot();
// Simulate a key press
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
} catch (AWTException e) {
e.printStackTrace();
}
}
}