2013-04-27 2 views
0

Je fais un jeu et j'ai cette classe que j'appelle GameLoop qui étend SurfaceView et implémente Runnable. Je veux appeler des méthodes à l'intérieur des objets de sprite de jeux et changer certaines de leurs valeurs dans les intervalles. J'ai donc eu l'idée d'avoir un objet Timer à l'intérieur du constructeur de la classe GameLoop et d'appeler les méthodes via un gestionnaire pour tous les objets sprites du jeu. Je l'ai fait avant, et puis ça marche, mais quand je le fais maintenant, le jeu force à se fermer! Qu'est-ce qui pourrait être mauvais et est-ce une meilleure façon de faire cela?La minuterie ne fonctionne pas en classe qui étend SurfaceView et implémente Runnable

C'est le code pour l'intervalle de temps que j'ai dans le constructeur de la classe GameLoop. Quand je supprime le code, ça marche bien, mais je n'ai pas d'intervalle !? L'aide est précieuse! Merci!

 // Set timer to call method to change directions of Circle object in interval 
    timer1.scheduleAtFixedRate(new TimerTask() 
    { 
     public void run() { 
      // Call method to change direction 
     } 

    }, 0, 1000); // 1 sec 
+0

S'il vous plaît afficher le stacktrace approprié montré dans LogCat ... – TomTasche

+0

avez-vous cela avant dans Android ou juste java? –

+0

Il semble que ça marche maintenant! J'utilise du code que j'ai obtenu à partir d'une réponse qui sera plus tard downvoted puis effacé! Je ne sais pas pourquoi il a été déprécié. Peut-être pas la meilleure solution. –

Répondre

1

Vos modifications à l'écran doivent aller dans le thread principal ou par runOnUiThread

runOnUiThread(new Runnable() { 
    public void run() { 
     /////your code here 
    } 
}); 

Vous pouvez ajouter un sommeil (1000,0) et vérifier le temps écoulé entre les appels pour le rendre à taux fixe .

public class MyUpdater extends Thread 
{ 

long milis; 
long nanos; 

private ArrayList<Updatable> updatables; 

public MyUpdater(long milis,long nanos) 
     { 
     super(); 

     this.milis=milis; 
     this.nanos=nanos; 

     updatables=new ArrayList<Updatable>(); 
     } 

public void run() 
     { 

    runOnUiThread(new Runnable() { 
    public void run() { 

     long previousTime=System.nanoTime(); 

     while(true) 
      { 
      sleep(milis,nanos); 

      long now=System.nanoTime(); 
      long elapsedTime=previousTime-now; 

      previousTime=now; 

      update(elapsedTime); 

      } 

     } 
     }); 
     } 


public synchronized void addUpdatable(Updatable object) 
     { 
     updatables.add(object); 

     } 

public synchronized void removeUpdatable(Updatable object) 
     { 
     updatables.remove(object); 

     } 

private synchronized void update(long elapsedTimeNanos) 
     { 
     for(Updatable object: updatables) 
     { 
     object.onUpdate(elapsedTimeNanos); 
     } 

     } 
} 

Vous avez besoin d'une interface ou d'une classe de mise à jour de base.

public Interface Updatable 
{ 
public void onUpdate(long elapsedTimeNanos); 
} 

Et un exemple

public class MyJozanClass implements Updatable() 
{ 
private float adjuster=0.00002f; ////you will have to adjust this depending on your ///times 

float x=0; 
float y=0; 

public MyJozanClass() 
{ 
} 

public void onUpdate(long elapsedTimeNanos) 
{ 

float newX=x+adjuster*elapsedTimeNanos; 
float newY=y+adjuster*elapsedTimeNanos; 

//////change positions 

} 

} 

Dans cette solution générale est preety beaucoup comme le système AndEngine.

+0

Bu si j'ajoute sommeil alors cela affecterait le reste du jeu !? –

+0

Cela affectera uniquement les objets à l'intérieur de thar Runnable. Vous pouvez en avoir un pour chaque appel, un pour chaque objet ou ce que je pense c'est mieux, un thread de mise à jour et une liste d'objets Updatables qui s'appellent à chaque fois –

+0

Hmm, c'est un peu difficile à comprendre! Je suppose que je dois en savoir plus sur Threads. Je pensais à avoir une sorte de minuterie dans chaque objet, de sorte que les objets sprite pourraient vivre leur propre vie, mais ce n'est peut-être pas une façon optimale de le faire! –

Questions connexes