Domanda

Sto lavorando su un piccolo gioco Android che gestisce tela che disegna su un filo di lavoro. Dopo che il gioco è sopra questo thread dovrebbe iniziare la prossima attività, ma in qualche modo la discussione dell'interfaccia utente sembra essere bloccata iniziando una nuova funzione.

Questo è il mio ciclo principale dei miei giochi:

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
.

La funzione performTick() elabora la logica del gioco e restituisce null quando finisce il gioco. draw()does il rendering. Entrambe le funzioni funzionano perfette: il problema è lose(), che non fa altro che avviare una nuova attività:

    protected void lose() {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(_context, MainMenu.class);
                _context.startActivity(intent);
            }
        });
    }
.

Quando il gioco finisce, il nuovo Activity (Mainmenu) inizia normalmente ma non reagisce su eventi touch. Non esiste un'uscita logcat e nessuna eccezione che si verifica. Peggio ancora peggio, lose()works normale quando si chiama prima che il loop principale inizi.

Ho lavorato su questo per giorni ora. Ho provato ad avviare l'attività direttamente dal thread funzionante (senza utilizzare un Handler in lose()) e cercato Internet per ore - niente aiuta. Sembra che il filo dell'interfaccia utente sia in qualche modo bloccato o catturato in un ciclo infinito, e non ho idea di come risolverlo.

Tutto è debug su un dispositivo Nexus 4.

btw: MainMenu.onCreate() funziona normale quando è iniziato un altro modo.

Aiuto per favore, Ma3o

È stato utile?

Soluzione

Non sblocchi la tela quando l'istruzione IF è vera.Break ti porterà fuori dal tempo, lasciando la tela bloccata.

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }

     // this line won't be executed whether the if statement above is true
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
.

Dovresti sbloccare all'interno dell'istruzione IF anche (prima o dopo perdere ()).

Altri suggerimenti

Invece Se While(true) hai potuto avere While(myVar) in cui myVar è un booleano che è vero mentre il gioco dovrebbe essere in esecuzione e impostato su false quando si chiama lose() nel tuo caso hai continuato a disegnare anche se non hai bisogno di.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top