我目前正在尝试按照名为“学习 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/