繁体   English   中英

Libgdx EXCEPTION_ACCESS_VIOLATION(0xc0000005)

[英]Libgdx EXCEPTION_ACCESS_VIOLATION (0xc0000005)

我目前正在尝试通过遵循标题为“学习Libgdx游戏开发”的书中的教程来学习libGdx,但发现了一个奇怪的错误。

有一个名为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();
        }
    }

该代码仅表示在显示“ Game Over”消息3秒钟后,用户将自动重定向到主菜单。 每当调用主游戏循环的渲染功能时,都会调用update函数。 但是在用户返回主菜单并尝试重新进入游戏屏幕后,出现以下错误:

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 Key的键事件,但是您无需更换机器人就可以更高效地完成操作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM