У меня есть заставка и класс экрана меню, которые загружают все мои атласы текстур и скины для меню и обрабатывают множество вещей. Если бы я поместил конструктор экрана меню в конструктор 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();
}
...
}
}
if(TimeUtils.millis() - startTime > 1500){
. Нехорошо ? - person gogonapel   schedule 08.05.2015