Сбой игры, если она была прервана при включенном экране-заставке - LIBGDX

У меня есть заставка и класс экрана меню, которые загружают все мои атласы текстур и скины для меню и обрабатывают множество вещей. Если бы я поместил конструктор экрана меню в конструктор SplashScreen или в метод create() моего основного игрового класса (класса MyGame), то он передал бы много время без рендеринга заставки на телефоне, пока загружается весь материал, поэтому я отложил загрузку класса меню до рендеринга второго кадра (вызывается в методе рендеринга SplashScreen во втором кадре); Я просто проверяю, прошел ли первый кадр, а затем вызываю метод основного игрового класса, который загружает меню.

Все работает нормально, как и ожидалось, но только если процесс загрузки SplashScreen не прерывается. Если мне звонят или я просто нажимаю кнопку ДОМОЙ на мобильном телефоне, а затем снова вхожу в игру, щелкнув значок на главном экране, я получаю сообщение об ошибке AndroidGraphics: "ожидание приостановка синхронизации заняла слишком много времени: предполагаемая тупиковая блокировка и уничтожение"; это сразу после того, как я вижу заставку на экране около секунды;

Я попытался разместить MyGame в методах hide() и pause() как основного игрового класса, так и класса экрана-заставки, поэтому он завершается, если я нажимаю кнопку 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();
        }

        ...
    }
}

person gogonapel    schedule 08.05.2015    source источник
comment
Просто чтобы убедиться: время ожидания заставки не является искусственным, верно?   -  person Docteur    schedule 08.05.2015
comment
Привет! Да у меня задержка 1500 мс. Только после этого я могу изменить экран, если меню грузятся. Я обновил приведенный выше код: if(TimeUtils.millis() - startTime > 1500){ . Нехорошо ?   -  person gogonapel    schedule 08.05.2015
comment
Привет! Хотя я, к сожалению, не могу помочь с вашей ошибкой, я не рекомендую использовать фальшивую заставку — это ненужно, долго и, хотя в первый раз выглядит потрясающе, становится скучно. В Интернете есть отличные ресурсы о том, как сделать настоящий (который исчезает при загрузке программы) - я могу дать вам ссылку сегодня вечером, если вы все еще здесь - и сделать настоящий может решите свою проблему. :-)   -  person Docteur    schedule 08.05.2015
comment
@Docteur Лично я, когда делал игры, делал заставку, которая появляется примерно на 2 секунды, но если вы нажмете на нее, заставка сразу же завершится и перейдет к следующему экрану :D   -  person EpicPandaForce    schedule 08.05.2015


Ответы (1)


Я не очень хорошо понимаю ваш вопрос, но если вы не используете класс AssetManger, я думаю, что это чтение может помочь, я надеюсь на это.

Если этот ответ недействителен или бесполезен для вас, сообщите мне и удалите

wiki 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

Это может помочь вам решить, нужно ли вам вызывать disose и как, надеюсь, это поможет.

person Angel Angel    schedule 08.05.2015
comment
Привет ! Не нужно удалять, но я уже использую AssetManager в своей игре. Моя проблема в том, что если игра находится в режиме заставки (и загружается материал), и я нажимаю кнопку HOME, то, когда я снова вхожу в игру, щелкая значок игры, система пытается восстановить приостановленный экземпляр, но терпит неудачу; у меня вылетает игра; поэтому мне нужно снова щелкнуть (коснуться) значка. - person gogonapel; 08.05.2015