Libgdx EXCEPTION_ACCESS_VIOLATION(0xc0000005)

问题描述:

我目前正试图通过一本名为“学习Libgdx游戏开发”的书中的教程来学习libGdx,并发现了一个奇怪的错误。Libgdx EXCEPTION_ACCESS_VIOLATION(0xc0000005)

有一个叫backToMenu功能:

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

它的目的仅仅是改变游戏画面ITO主菜单画面。 MenuScreen上的游戏开始,由用户单击开始,转换到GameScreen。一旦用户在GameScreen上,他/她有两种方法返回到MainMenu,通过按下退出按钮或达到游戏结束状态。首先,通过点击逃生按钮,我只需监听事件:

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

    return false; 
} 

keyUp是一个被覆盖的InputAdapter函数。这个工作非常好。在第二选项,会出现问题:

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

的代码只是意味着,显示“游戏结束”消息之后3秒,用户将自动重定向到主菜单。每次调用主游戏循环的渲染函数时都会调用更新函数。但是用户来到后回到主菜单,并试图重新进入的游戏画面,我得到了以下错误:

已经由Java运行时环境检测到致命错误:

 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] 

奇怪的是,如果我试图模拟用户按下退出按钮,而不是直接调用backToMenu,它突然工作!用户可以来回走MainScreen之间 - > GameScreen - > GAMEOVER - > MainScreen - > GameScreen就好

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

     } 
    } 

有同样的问题,我不知道确切的问题是这样的解决方法是什么产生ESCAPE的关键的关键事件 但是你可以通过更换

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

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

随着keyUp(Keys.ESCAPE);

更有效地做到这一点,而不机器人