如果在启动画面显示时中断,游戏会崩溃 - LIBGDX

5
我有一个闪屏和一个菜单屏幕类,它们加载所有用于菜单的纹理图集和皮肤,并处理了很多东西。如果我把菜单屏幕的构造函数放在SplashScreen构造函数或主游戏类(MyGame类)的create()方法中,则会在手机上加载整个内容且没有闪屏渲染图像的情况下花费很长时间,因此我延迟了对菜单类的加载到第二个帧渲染(在第二个帧中的SplashScreen render方法中调用)。我只需检查是否通过了第一帧,然后调用主游戏类的一个方法来加载菜单。
预料之中的一切都很好,但仅当未中断SplashScreen加载过程时才有效。如果我接到电话或者按下手机的HOME按钮,然后通过单击主屏幕上的图标重新进入游戏,我就会遇到一个AndroidGraphics错误:“等待暂停同步时间太长:假定死锁并终止”。这是在我可以看到屏幕上的闪屏大约一秒钟后发生的。
我尝试在主游戏类和闪屏屏幕类的hide()和pause()方法中处理MyGame,以便在按下HOME按钮时终止它,但它们从未被调用。
我该如何解决这个问题?在加载游戏时接到电话并在完成通话后尝试重新进入游戏崩溃是很烦人的。
public class MyGame extends Game{
    ...
    public MainMenu menu;
    ...
    @Override
    public void create(){ 
        this.screen_type == SCREEN_TYPE.SPLASH;
        splashScreen = new SplashScreen();
        setScreen(splashScreen);
    }
    ...
    @Override 
    public void pause(){
        //never gets called if I press the HOME button in middle of splash screen
        if(this.screen_type == SCREEN_TYPE.SPLASH)
        {
            this.dispose();
        }
    }
    ... 
    public void LoadMenuTimeConsumingConstructor(){
        //load all menus and process data
        main_menu = new MainMenu();
        loaded_menu = true;
    }
}

public class SplashScreen implements InputProcessor, Screen{

    public MyGame main_game;
    ...
    public SplashScreen(MyGame game){
        this.main_game = game;
    }

    @Override
    public void pause(){
        //never gets called if I press the HOME button in middle of splash screen
        if(main_game.screen_type == SCREEN_TYPE.SPLASH)
        {
            main_game.dispose();
        }
    }

    @Override 
    public void hide(){
        //never gets called if I press the HOME button in middle of splash screen
        if(main_game.screen_type == SCREEN_TYPE.SPLASH)
        {
            main_game.dispose();
        }
    }

    @Override 
    public void render(delta float){
        ...

        //wait 1.5 sec
        if(TimeUtils.millis() - startTime > 1500){
        {
            if(main_game.loaded_menu = true){
                main_game.setScreen(main_game.main_menu);
            }

        } 

        ...

        if(is_this_second_frame){  // we start loading menus in the second frame so we already have the splash onscreen
            main_game.LoadMenuTimeConsumingConstructor();
        }

        ...
    }
}

只是为了确认一下:启动画面的等待时间不是人为的,对吧? - Docteur
嗨!是的,我有一个1500毫秒的延迟。只有在菜单加载完成后,我才能更改屏幕。我已经更新了上面的代码:if(TimeUtils.millis() - startTime > 1500){。这样可以吗? - gogonapel
2
你好!虽然我无法帮助你解决错误,但我不建议使用“假”启动屏幕——它是不必要的、冗长的,而且虽然第一次看起来很棒,但很快就会变得无聊。在互联网上有很多关于如何制作真正的启动屏幕(当程序加载完成后消失)的资源——如果你还在这里,今晚我可以给你提供一些链接——制作一个真正的启动屏幕可能会解决你的问题。 :-) - Docteur
1
@Docteur,就我个人而言,在制作游戏时,我会制作一个闪屏,大约持续2秒钟,但如果您点击它,则会立即结束闪屏并进入下一个屏幕:D - EpicPandaForce
1个回答

2
我不是很理解你的问题,但如果你没有使用AssetManager类,我认为这篇文章可以帮助你,希望如此。
如果这个回答对你无效或没有用处,请告诉我并删除。
LibGDX的维基百科: https://github.com/libgdx/libgdx/wiki/Managing-your-assets YouTube上的视频: https://www.youtube.com/watch?v=JXThbQir2gU GitHub上的其他示例: https://github.com/Matsemann/libgdx-loading-screen 新的内容请看: Libgdx中处理屏幕的正确方法

如何正确处理libgdx的Screen对象?

它可以帮助你决定是否需要调用dispose方法,以及如何调用。我希望它能对你有所帮助。


嗨!不需要删除,但我已经在我的游戏中使用了AssetManager。我的问题是,如果游戏处于闪屏模式(并正在加载内容),而我按下HOME按钮,然后通过单击游戏图标重新进入游戏,则系统会尝试恢复“暂停的实例”,但失败了;我得到了游戏崩溃;因此,我必须再次点击(触摸)图标。 - gogonapel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接