2017-04-01 1 views
0

Je crée un jeu simple clic qui fraie ennemis à l'écran et lorsque l'utilisateur clique dessus, ils obtiennent des points et les ennemis sont détruits. Je fais cela en rendant les imagesbox visibles et invisibles lorsque l'utilisateur clique dessus. Ils fonctionnent sur une minuterie et ont une boucle constante de frai.Android Studio: TimerTask

Actuellement, je veux mettre en œuvre une façon dont l'utilisateur va commencer à perdre de la santé. Donc, je voudrais vérifier si l'imagebox ennemi est visible, si c'est le cas, le joueur perdra lentement la santé.

Je suis confondu avec la création d'une tâche de minuterie qui peut rafraîchir l'interface utilisateur pour ce travail. Je veux être en mesure de vérifier l'interface utilisateur en permanence si certaines images sont visibles ou non. J'ai commencé à partir de mes propres recherches, mais le jeu se bloque lorsqu'il est chargé si cela est mis en œuvre.

minuterie pour rafraîchir l'interface utilisateur:

private Timer mTimer1; 
private TimerTask mTt1; 
private Handler mTimerHandler = new Handler(); 

    public void onStart() { 
    mTimer1 = new Timer(); 
    mTt1 = new TimerTask() { 
     public void run() { 
      mTimerHandler.post(new Runnable() { 
       public void run() { 
        //TODO 
        final TextView health = (TextView) findViewById(R.id.Health); 
        health.setText("Health: " + health2); 

        //Enemy ImageViews 
        final ImageView enemy1 = (ImageView) findViewById(R.id.enemy1); 
        final ImageView enemy2 = (ImageView) findViewById(R.id.enemy2); 
        final ImageView enemy3 = (ImageView) findViewById(R.id.enemy3); 
        final ImageView enemy4 = (ImageView) findViewById(R.id.enemy4); 

        //sets imageViews into array 
        final ImageView[] enemies = new ImageView[4]; 
        enemies[0] = enemy1; 
        enemies[1] = enemy2; 
        enemies[2] = enemy3; 
        enemies[3] = enemy4; 

        boolean running = true; 
        while (running) { 
         if (enemy1.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy2.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy3.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy4.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 

        } 
       } 
      }); 
     } 


    }; 
    mTimer1.schedule(mTt1, 1, 5000); 
} 

} 

C'est la tâche de minuterie j'ai créé. Je voudrais savoir pourquoi cela bloque mon jeu et comment résoudre ce problème. Je n'ai jamais utilisé la minuterie de cette façon auparavant, donc si le problème est évident c'est pourquoi je ne l'ai pas remarqué.

J'ai beaucoup plus de code dans la méthode onCreate et peut envoyer des messages en cas de besoin. Merci pour toute l'aide et les conseils pour ce débutant.

Accident:

enter image description here

+0

Poster le journal crash –

Répondre

1

Basé sur le message d'erreur vous devez appeler super.onStart() si vous avez besoin d'ajouter que ici:

onStart public void() {

super.onStart();

// votre code

}

Je suppose que vous savez, mais juste au cas où super est classe vous étendez, le parent. Si vous remplacez sa fonction onStart, la procédure onStart normale n'est pas exécutée si vous n'appelez pas la super fonction.

EDIT: comme pour l'autre question, je (comme un débutant avec java, donc je ne prétends pas que c'est la meilleure façon d'aller) penserais le long des lignes de faire quelque chose comme:

Première créer un gestionnaire et faire runnables pour les ennemis:

Handler handler = new Handler(); 
Runnable[] eRunnables = new Runnable[enemies.length-1]; 

for(int i = 0; i < eRunnables.length; i++){ 
    eRunnables[i] = new Runnable(){ 
     public void run(){ 
      if(enemies[i].getVisibility() == View.VISIBLE){ 
       health2--; 
       health.setText("Health:" + health2); 
       handler.postDelayed(eRunnables[i], 1000); 
      }  
     } 
    }; 
} 

et puis où vous faites d'abord les ennemis visibles (en plus de les mettre à visible) faire quelque chose comme

handler.postDelayed (eRunnable [enemyNr], 1000)

remplacer 1000 avec ofcourse cependant beaucoup de millisecondes que vous voulez.

Encore une fois, je ne dis pas que cela est la meilleure façon, tout ce que je pensais jusqu'à.

+0

Merci mon erreur ce fait permettre au onStart à appeler, mais un nouveau problème se produit de l'instruction while. Mon écran de jeu ne charge pas et l'écran reste noir, pas de crash, aucune idée pourquoi? –

+0

@GeorgeBrooks je suis assez nouveau pour java moi-même, mais je ne pense pas qu'une boucle infinie comme celle-ci serait bonne qu'elle continue à fonctionner 100% du temps il n'y a pas de pauses ou rien dans cette boucle .. quel est le point de votre timertask s'il a quelque chose d'infini là-dedans? – Henk

+0

J'ai besoin qu'il soit infini pour vérifier en permanence l'interface utilisateur pour les changements? c'était mon idée initiale. Je peux me tromper en disant que cela doit être fait de cette façon. –