2017-10-07 2 views
1

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(); 
      } 

     } 
    } 

Antwort

0

haben das gleiche Problem, ich weiß nicht, was genau das Problem ist so Abhilfe ist, zu erzeugen, das Schlüsselereignis der Escape-Taste Aber man kann durch den Ersatz

try { 
      Robot robot = new Robot(); 
      // Simulate a key press 
      robot.keyPress(KeyEvent.VK_ESCAPE); 
      robot.keyRelease(KeyEvent.VK_ESCAPE); 

     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 

Mit keyUp(Keys.ESCAPE);

ohne Roboter sie effizienter machen
Verwandte Themen