2015-05-08 14 views
5

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(); 
     } 

     ... 
    } 
} 
+0

Solo per essere sicuri: il tempo di attesa dello splashscreen non è artificiale, giusto? – Docteur

+0

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

+2

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

risposta

2

Non capisco la tua domanda molto bene, ma se non si utilizza AssetManger classe, credo che questa lettura può aiutare, lo spero.

Se questa risposta non è valido o non è utile a te, dimmi, ed eliminare

wiki LibGDX https://github.com/libgdx/libgdx/wiki/Managing-your-assets

video su YouTube https://www.youtube.com/watch?v=JXThbQir2gU

altro esempio in GitHub https://github.com/Matsemann/libgdx-loading-screen

NOVITÀ guarda:

Proper way to dispose screens in Libgdx

What's the right place to dispose a libgdx Screen

Essa può aiutare a decidere se è necessario chiamare dipose, e come, spero che sarà di aiuto.

+0

Ciao! Non c'è bisogno di cancellare ma già utilizzo AssetManager nel mio gioco. Il mio problema è che se il gioco è in modalità splash screen (e caricamento di materiale) e premo il pulsante HOME, quando torno nel gioco facendo clic sull'icona del gioco, il sistema tenta di recuperare "l'istanza in pausa" ma fallisce; ottengo un crash del gioco; quindi devo cliccare di nuovo (toccare) l'icona. – gogonapel

+1

@gogonapel guarda nuova modifica –

Problemi correlati