2

敵がランダムに出現し、画面上のポイントに向かって移動するゲームを作成しようとしています。私の問題は、プログラムがそれらが生成されるのを待ち、それらが移動を開始することです。スポーンするときに動き始め、それぞれの間に短い休憩をとってもらいたいです。

それらを動かす背後にある 2 つの主な方法を次に示します。

public void newLevel() {
    runOnUiThread(new Runnable(){
        public void run() {
            int i = 0;
            while( i < 10){
                addSpeks();
                i++;
                try {
                    Thread.sleep(2000);
                }
                catch(InterruptedException ie){
                    ie.printStackTrace();
                }
            }
        }
    });
}

public void addSpeks() {
    Spek newSpek = new Spek(this);

    setRandomRegion();

    newSpek.setX(spawnX);
    newSpek.setY(spawnY);

    relativeLayout.addView(newSpek);
    spekList.add(newSpek);
    newSpek.setOnClickListener(spekListener);
    newSpek.animate().x(finalX).y(finalY).setDuration(8000);
}

Spek は ImageView を拡張する単純なクラスであり、setRandomRegion() は画面の境界でランダムな x、y 座標を選択します。簡単にするために while ループにカウンターがありますが、最終的には、ゲームに負けた場合にのみ停止する条件付き無限ループに移動したいと考えています。

ご協力いただきありがとうございます。問題をさらに明確にする必要があるかどうかをお知らせください。

4

2 に答える 2

1

newLevel()メソッドはUIスレッドで完全に実行され、UIスレッドを 反復Thread.sleep(2000);ごとに2秒待機させています。この種の遅延を追加するには、Handler を使用できます。

Handler をメンバー クラスとして宣言する

final Handler mHandler = new Handler();
int i = 0;

それに応じて newLevel を変更します。

public void newLevel() {
    mHandler.postDelayed(new Runnable(){
        public void run() {
            if (i > 10) {
              mHandler.removeCallbacks(this);
              return;
            }
             addSpeks();
             i++;
             mHandler.postDelayed(this, 2000);                 
        }
    }), 2000);
}

もう 1 つの最適化は、newLevel が呼び出されるたびに実行を回避するために、Runnable インスタンスを最終メンバーとして宣言することです。タイプミスをチェック

于 2014-11-11T08:57:08.047 に答える