java - Libgdx EXCEPTION_ACCESS_VIOLATION (0xc0000005)

标签 java libgdx jvm

我目前正在尝试按照名为“学习 Libgdx 游戏开发”的书中的教程来学习 libGdx,并发现了一个奇怪的错误。

有一个名为 backToMenu 的函数:

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

其目的只是将游戏屏幕更改为主菜单屏幕。游戏从菜单屏幕开始,通过用户单击启动,然后过渡到游戏屏幕。一旦用户进入游戏屏幕,他/她有两种方法返回主菜单,或者通过点击退出按钮,或者当达到游戏结束状态时。首先,通过点击退出按钮,我只需监听该事件:

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 秒后,用户将自动重定向到主菜单。每次调用主游戏循环的渲染函数时都会调用更新函数。但是当用户返回主菜单并尝试重新进入游戏屏幕后,我收到以下错误:

Java 运行时环境检测到 fatal error :

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

WithkeyUp(Keys.ESCAPE);

关于java - Libgdx EXCEPTION_ACCESS_VIOLATION (0xc0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46617876/

相关文章:

java - 链表串联

java - 如何在 TDB TripleStore 中加载模型

使用桥接 libgdx 到 Windows Phone

java - 难道每个线程都不需要自己的 JVM 副本吗?

java - 如何让弹跳球移动得更快?动态速度?

java - 为什么 Eclipse 或 IntelliJ 中的控制台总是为空?

android - libgdx SpriteBatch 渲染到纹理

libgdx - 增加使用 LibGDX 中的形状渲染器绘制的线条的宽度

Java 详细类加载

Java eclipse,为什么JVM崩溃?