1

こんにちは、私はゲームを開発しています。ランダムな期間にいくつかのスプライトを表示したいので、これを行いました:

for (int i = 0; i < 30; i++) {

    final int min = 5000;
    final int max = 25000;
        Random r = new Random();
        int i1 = r.nextInt(max - min + 1) + min;
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {

            public void run() {
                //MyCODE  
            }
        }, i1);}

    }

しかし、問題は、私が postDelayed を使用したときに、今から i1 の 30 倍の時間をすでに定義していて、スプライトがすべて一緒に表示されることです。

私がやりたいことは次のとおりです。

 i1 = New random number between 5000-25000 -> first = run //MyCODE after "i1" seconds -> i1 = New random number between 5000-25000 -> second = run //MyCODE after "i1" seconds since "first" ........
4

1 に答える 1

0

問題は「時々」という意味だと思います。つまり、ランダムを使用しているということです。時々時間の範囲内にあるので、それらすべてを同時に取得することは完全に可能です。

また、同じシードを使用して同じRandom()番号ジェネレーターを再作成しているため、最初に呼び出したときに同じ番号が生成される可能性があります。ランダムは決して真にランダムではありません。

現在の時刻のシードを使用してランダムなオブジェクトを1つ作成します。それはそれがそうであるよりランダムに見えるようになります。

Handler spriteHandler = new Handler(); // Keep this global to the scope of the class. You only need one.
final int MIN = 5000;
final int MAX = 25000;
Random r = new Random(System.getCurrentTimeMillis()); 

for (int i = 0; i < 30; i++) {
        int i1 = r.nextInt(MAX - MIN + 1) + MIN;
        spriteHandler.postDelayed(new Runnable() {
            public void run() {
                //MyCODE  
            }
        }, i1);}
    }

それらを同時に表示したくない場合は、すでに表示されている場合は時間を調整するアルゴリズムを導入する必要があります。それはあなたが望むものに依存するでしょう。

于 2012-10-31T15:11:29.487 に答える