Libgdx EXCEPTION_ACCESS_VIOLATION(0xc0000005)

时间:2017-10-07 07:39:58

标签: java libgdx jvm

我目前正在尝试学习libGdx,请参阅一本名为" Learning Libgdx Game Development"并发现了一个奇怪的错误。

有一个名为backToMenu的函数:

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

它的目的只是改变游戏画面到主菜单屏幕。游戏从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();
        }
    }

代码只是意味着,&#34; Game Over&#34;消息显示3秒钟,用户将自动重定向到主菜单。每次调用主游戏循环的渲染功能时都会调用更新函数。但是在用户返回主菜单并尝试重新进入游戏画面后,我收到以下错误:

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]

奇怪的是,如果我试图模拟用户按下转义按钮而不是直接调用backToMenu,它会突然起作用!用户可以在MainScreen - &gt;之间来回切换。 GameScreen - &gt; GameOver - &gt; MainScreen - &gt; 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();
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

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

来更有效地实现它
keyUp(Keys.ESCAPE);

使用#t:: Send, {LCtrl Down} Sleep, 1000 Send, {V} Sleep, 1000 Send, {V} Sleep, 1000 Send, {LCtrl Up} return