2012-10-20 6 views
1

J'ai créé un jeu avec minuterie, j'essaie de faire que lorsque le minuteur est à la fin, le joueur verra une fenêtre d'alerte ou tout type de pop up qui dit "niveau complet", vos points sont xxx et un bouton pour le niveau suivant. J'ai essayé quelque chose mais le temps fini mais pas de popup. une idée?Android - Fonction minuterie et alertDialog

Classe de temps: fonctionne bien.

temps public class {

private String time; 
private boolean isDone; 

public Time() { 
    super(); 
    isDone=false; 
} 

CountDownTimer count = new CountDownTimer(5000, 1000) { 

public void onTick(long millisUntilFinished) { 

    int seconds = (int) (millisUntilFinished/1000); 
    int minutes = seconds/60; 
    seconds = seconds % 60; 
    String tempSec=Integer.toString(seconds); 
    if (tempSec.length()==1){ 
     tempSec="0"+tempSec; 
    } 
    time="Time Left: " + minutes + ":"+tempSec; 
} 

public void onFinish() { 
    setDone(true); 
} 

}.start(); 

C'est la classe d'activité:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    club=new Club(); 
    clubView = new ClubView(this, club); 
    mole=new Mole(); 
    stageView=new StageView(this); 
    moleView=new MoleView(this,mole); 
    pointsView=new PointsView(this); 

    time=new Time(); 
    timerView=new TimerView(this, time); 

    allViews=new AllViews(this); 
    allViews.setViews(stageView, moleView, pointsView, timerView,clubView); 

    setContentView(allViews); 
    allViews.setOnTouchListener((View.OnTouchListener)this); 

    if (timerView.getTime().isDone()){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Level Complete"); 
     builder.setMessage("your score is"+pointsView.getPoint()); 
     AlertDialog dialog = builder.create(); 
     dialog.show(); 
    } 

} 

Répondre

1

Le point est que la minuterie prend un certain temps pour manquer et vous vérifiez juste une fois si la minuterie est terminée:

if (timerView.getTime().isDone()){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Level Complete"); 
    builder.setMessage("your score is"+pointsView.getPoint()); 
    AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 

Une meilleure option serait de créer une sorte de boucle, mais c'est interdit! Parce que vous bloquer le thread principal.

La prochaine option que vous avez est de créer une sorte d'écouteur. L'auditeur fera une sorte de rappel à votre activité pour dire "j'ai fini". Cela se fait souvent à l'aide des interfaces,

Petit exemple:

public class Time { 

    private String time; 
    private boolean isDone; 
    private TimerCallback timerCallback; 

    public Time(TimerCallback t) { 
     this.timerCallback = t; 
     isDone = false; 
    } 

    public interface TimerCallback { 
     abstract void onTimerDone(); 
    } 

    CountDownTimer count = new CountDownTimer(5000, 1000) { 

     public void onTick(long millisUntilFinished) { 

      int seconds = (int) (millisUntilFinished/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 
      String tempSec = Integer.toString(seconds); 
      if (tempSec.length() == 1) { 
       tempSec = "0" + tempSec; 
      } 
      time = "Time Left: " + minutes + ":" + tempSec; 
     } 

     public void onFinish() { 
      setDone(true); 
      timerCallback.onTimerDone(); 
     } 

    }.start(); 

} 

Et votre activité ressemblerait à ceci:

public class myActivity extends Activity implements TimerCallback { 
//I have now clue how your activity is named but it's just an example! 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     club = new Club(); 
     clubView = new ClubView(this, club); 
     mole = new Mole(); 
     stageView = new StageView(this); 
     moleView = new MoleView(this, mole); 
     pointsView = new PointsView(this); 

     //Because we are implementing the TimerCallback interface "this" is a valid argument 
     //this can be cast to TimerCallback: "(TimerCallback) this" 
     time = new Time(this); 
     timerView = new TimerView(this, time); 

     allViews = new AllViews(this); 
     allViews.setViews(stageView, moleView, pointsView, timerView, clubView); 

     setContentView(allViews); 
     allViews.setOnTouchListener((View.OnTouchListener) this); 


    } 

    //We must add this method, because we have implemented the TimerCallback interface! 
    public void onTimerDone(){ 
     //You could remove the isDone check because it is not really necessary 
     if (timerView.getTime().isDone()) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Level Complete"); 
      builder.setMessage("your score is" + pointsView.getPoint()); 
      AlertDialog dialog = builder.create(); 
      dialog.show(); 
     } 
    } 

} 

J'ai posté une réponse très similaire, mais dans cette question là Il n'y a pas de minuterie mais une sorte d'événement "gameover". How do I perform a continuous check on andorid of the returned value of another class?

Et un lien wiki sur le modèle d'écoute, ou un motif d'observateur http://en.wikipedia.org/wiki/Observer_pattern

Rolf

+0

Merci, solution Excelent, un conseil sur l'ajout de bouton à l'alerte? – cfircoo

+0

Jetez un oeil ici, http://developer.android.com/guide/topics/ui/dialogs.html setPositiveButton et Négatif pourrait être une solution. –