2017-10-07 2 views
1

J'essaie actuellement d'apprendre libGdx en suivant le tutoriel d'un livre intitulé "Learning Libgdx Game Development" et j'ai trouvé un bug étrange.Libgdx EXCEPTION_ACCESS_VIOLATION (0xc0000005)

Il y a une fonction appelée backToMenu:

private void backToMenu() { 
    // switch to menu screen 
    game.setScreen(new MenuScreen(game)); 
} 

Son but est simplement changer l'écran de jeu ito écran du menu principal. Le jeu commence sur le MenuScreen qui passe à GameScreen, initié par un clic de l'utilisateur. Une fois que l'utilisateur est sur le GameScreen, il/elle a deux façons de revenir dans MainMenu, soit en appuyant sur le bouton d'échappement ou lorsque l'état de jeu est atteint. Tout d'abord, par appuyez sur le bouton d'échappement, j'écoute simplement pour l'événement:

public boolean keyUp (int keycode) { 
    // Back to Menu 
    if (keycode == Input.Keys.ESCAPE) 
     backToMenu(); 

    return false; 
} 

Le keyUp est une fonction InputAdapter surchargée. Celui-ci fonctionne parfaitement bien. Le problème se produit sur la deuxième option:

public void update (float deltaTime) 
{ 
    handleDebugInput(deltaTime); 
    if (isGameOver()) { 
     timeLeftGameOverDelay -= deltaTime; 
     if (timeLeftGameOverDelay < 0) 
     { 
      //init(); 
      backToMenu(); 
     } 
    } 

Le code signifie simplement, après un message « Game Over » est affiché pendant 3 secondes, l'utilisateur va être redirigé automatiquement dans le menu principal. La fonction de mise à jour est appelée à chaque fois que la fonction de rendu de la boucle de jeu principale est appelée. Mais après que l'utilisateur revient au menu principal et a essayé de nouveau entrer dans l'écran de jeu, je suis l'erreur suivante:

Une erreur fatale a été détectée par le Java Runtime Environment:

 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] 

Étrangement, si J'ai essayé de simuler l'utilisateur en appuyant sur le bouton d'échappement au lieu de rappeler directementToMenu, ça marche tout à coup! L'utilisateur peut aller et venir entre MainScreen -> GameScreen -> GameOver -> MainScreen -> GameScreen très bien

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

     } 
    } 

Répondre

0

eu le même problème, je ne sais pas quel est le problème exact est donc solution de contournement est de générer l'événement clé de ESCAPE Key Mais vous pouvez le faire plus efficacement sans robot en remplaçant

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

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

Avec keyUp(Keys.ESCAPE);