Question

Je suis en train de travailler sur un petit jeu Android qui gère toile dessin sur un thread de travail.Après le jeu est terminé ce fil devrait commencer à la prochaine activité, mais de toute façon le thread d'INTERFACE utilisateur semble être bloqué par le démarrage d'une nouvelle fonction.

C'est mon Principal des jeux en Boucle:

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 fonction performTick() les processus de la logique de jeu et les retours null lorsque le jeu se termine. draw()le rendu.Les deux Fonctions de travail parfait - le problème est lose(), qui ne fait rien que de se lancer dans une nouvelle Activité:

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

Lorsque le Jeu se termine, la nouvelle Activiy (MainMenu) démarre normalement mais ne réagit pas sur tout les événements tactiles.Il n'y a pas de LogCat de sortie et aucune Exception produite.Pire encore, lose()fonctionne normalement quand elle est appelée AVANT la boucle principale commence.

J'ai travaillé sur ce projet pendant des jours maintenant.J'ai essayé de démarrer directement à partir du Fil de travail (sans l'aide d'un Handler dans lose()) et cherché sur Internet pendant des heures - rien n'y fait.Il semble que le Thread d'INTERFACE utilisateur est en quelque sorte bloqué ou coincé dans une boucle infinie, et je n'ai aucune idée de comment résoudre ce problème.

Tout est réglé sur un Nexus 4 de l'appareil.

Btw: MainMenu.onCreate() fonctionne normalement quand a commencé une autre façon.

S'il vous plaît aider, MA3o

Était-ce utile?

La solution

Vous n'avez pas déverrouiller la toile lorsque la si l'énoncé est vrai.Pause va vous sortir de la tout en laissant la toile verrouillé.

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

Vous devez le déverrouiller à l'intérieur de l'instruction si aussi (avant ou après la perdre()).

Autres conseils

Au lieu de cela, si While(true) vous pourriez avoir While(myVar)myVar est un booléen qui est vrai, tout jeu doit être en cours d'exécution et la valeur false lorsque vous appelez lose() Dans votre cas, vous avez continué à dessiner même si vous n'avez pas besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top