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