我目前正試圖通過一本名爲「學習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();
}
}
}