1

私はタイマー付きのゲームを作成しました。タイマーが終了すると、プレーヤーにアラートポップアップまたは「レベル完了」というポップアップが表示されるようにしようとしています。ポイントはxxxで、次のレベルのボタンが表示されます。私は何かを試しましたが、時間が経ちましたが、ポップアップはありませんでした。何か案が?

タイムクラス:問題なく動作します。

パブリッククラス時間{

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

これはActivityクラスです:

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

}
4

2 に答える 2

1

重要なのは、タイマーが切れるまでに少し時間がかかり、タイマーが終了したかどうかを1回だけチェックしているということです。

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

より良いオプションは、ある種のループを作成することですが、これは禁止されています!メインスレッドをブロックするからです。

次のオプションは、ある種のリスナーを作成することです。リスナーは、アクティビティに対して何らかのコールバックを実行して、「完了」を通知します。これは多くの場合、インターフェイスを使用して行われます。

小さな例:

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

}

そして、あなたの活動は次のようになります:

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

}

私はここに非常によく似た答えを投稿しましたが、この質問にはタイマーはありませんが、ある種の「ゲームオーバー」イベントがあります。 別のクラスの戻り値のandoridを継続的にチェックするにはどうすればよいですか?

そして、リスナーパターンまたはオブザーバーパターンに関するwikiリンク http://en.wikipedia.org/wiki/Observer_pattern

ロルフ

于 2012-10-20T09:35:13.293 に答える
0

TimerおよびTimerTaskを使用して、スケジュールされたアクションを実行します。例はここここにあります。

于 2012-10-20T09:39:42.757 に答える