ho una schermata iniziale e un menù di classe schermo che carica tutti i miei atlanti di texture e pelli per il menu ed elabora un sacco di roba. Se metto il costruttore per la schermata di menu nel costruttore SplashScreen o nel metodo create() della mia classe di gioco principale (classe MyGame), passerebbe molto tempo senza alcuna immagine di rendering splash screen sul telefono mentre l'intera roba viene caricata, ho ritardato il caricamento della classe di menu sul secondo frame render (viene chiamato nel metodo di rendering SplashScreen nel secondo frame); Semplicemente controllo se ho passato il primo frame, poi chiamo un metodo sulla classe di gioco principale che carica i menu.Crash gioco se interrotto mentre Splash Screen è on - LIBGDX
Tutto funziona correttamente, come previsto, ma solo se il processo di caricamento di SplashScreen non viene interrotto. Se ricevo una chiamata o semplicemente preme il tasto HOME del cellulare e poi rientro nel gioco facendo clic sull'icona nella schermata iniziale ottengo un errore AndroidGraphics: "in attesa che la sincronizzazione della pausa impiegasse troppo tempo: assumendo dead lock and killing "; questo è solo dopo che posso vedere lo splash screen sullo schermo per circa un secondo;
Ho provato a mettere il MyGame nei metodi hide() e pause() sia della classe di gioco principale che della classe di splash screen, quindi è terminato se premo il tasto HOME ma non vengono mai chiamati.
Come posso risolvere questo? Sarebbe fastidioso ricevere una chiamata durante il caricamento del gioco e dopo aver terminato la chiamata e provare a rientrare nel gioco si blocca.
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();
}
...
}
}
Solo per essere sicuri: il tempo di attesa dello splashscreen non è artificiale, giusto? – Docteur
Ciao! Sì, ho un ritardo di 1500 ms. Solo dopo posso cambiare lo schermo se i menu sono caricati. Ho aggiornato il codice sopra: 'if (TimeUtils.millis() - startTime> 1500) {'. Non bene ? – gogonapel
Ciao! Anche se purtroppo non posso aiutare sul tuo bug, non consiglio l'uso di uno splashscreen "falso" - non è necessario, a lungo, e mentre sembra fantastico la prima volta, diventa noioso. Ci sono grandi risorse su come realizzarne uno reale (che scompare quando il programma è caricato) su Internet - Posso collegarti un po 'stasera se sei ancora in giro - e fare un vero ** può ** aggiustare il tuo problema.:-) – Docteur