1

私の質問はこれです、私は毎秒(毎秒30フレーム)岩を追加したいです、私は異なるレベルを持っています、これは私が各レベルで異なる量の岩を持っていることを意味し、私は異なる速度を持っているので、10を追加したいですレベル 1 で合計 30 秒で岩、レベル 2 で合計 20 秒で 20 石などです。たくさんのレベルを作れるようにダイナミックにしたいです。これを行うにはどうすればよいですか

カウンターを保持したくないので、カウンターが 30 になるたびにロックを追加してリセットします。

前もって感謝します

switch(difficulty)
            {
                case 1:
                    timer = 30;
                    numberOfRocks = 10;
                    break;
                case 2:
                    timer = 20;
                    numberOfRocks = 20;
                    break;
                case 3:
                    timer = 10;
                    numberOfRocks = 30;
                    break;
                case 4:
                    timer = 5;
                    numberOfRocks = 40;
                    break;
            }

            addEventListener(Event.ENTER_FRAME, loop)
        }
        private function loop(e:Event):void
        {   
            for (var i:int = 0; i < (timer * 30); i++)
            {
                    a_bitmap = new a_class();
                    a_bitmap.x = 750;
                    a_bitmap.y = Math.ceil(Math.random() * (600 - a_bitmap.height));
                    a_bitmap.height = 35;
                    a_bitmap.width = 35;
                    addChild(a_bitmap);
                    a_bitmap.name = "astroid" + i + "";
                    myArray.push(true);
            }
        }
4

4 に答える 4

1

flash.utils.setInterval 関数を使用することもできます。

setInterval(trace , 1000 , "trace message once per second");
于 2012-06-30T15:18:40.840 に答える
1

タイマーは、フレーム ハンドラーよりもニーズに適している場合があります。ハードコードされた switch ステートメントの代わりに数学を使用してレベル パラメータを計算することをお勧めします。そうすれば、好きなだけレベルを追加できます (または、ゲームを無期限に実行できます)。

var rockLoadTimer:Timer;

function gameInit():void {
    //your games initialization code here

    //create a timer that fires every second when running
    rockLoadTimer = new Timer(1000);

    //the function to call every time the timer fires.  You could also listen for TIMER_COMPLETE is wanted to run a function once all rocks are loaded
    rockLoadTimer.addEventListener(TimerEvent.TIMER, addNextRock);
}

function startLevel(difficulty:int = 1):void {
    //your code here to clear the level 


    //repeat count is used as the amount of rocks to load this level - level number times 10
    rockLoadTimer.repeatCount = difficulty * 10;

    //the delay time is how quickly you want the rocks to load.  this is 5 seconds divided by the difficulty level
    //so the first level would be every 5 seconds, second would be every 2 and a half seconds, third level would be every second and two thirds. etc.  
    rockLoadTimer.delay = Math.round(5000 / difficulty);

    rockLoadTimer.reset();
    rockLoadTimer.start();

}

function addNextRock(e:Event = null):void {
    //your rock creation code here
}
于 2012-06-29T19:32:00.073 に答える
1

を使用して、ティックごとにTimerのインスタンスを作成できます。a_class

var timer:Timer = new Timer(1000, 30); // One per second for 30 seconds
timer.addEventListener(TimerEvent.TIMER, addAsteroid);
timer.start();
function addAsteroid():void {
    a_bitmap = new a_class();
    // etc.
}

タイマーの遅延は「ミリ秒あたりの小惑星」なので、30 秒かけて 10 個作成する場合は、30000/10= 3000 に設定します。

ただし、このアプローチはフレームレートが滑らかな場合に最も効果的です。1 秒に 1 回実行されますが、Flash が 30 fps 未満で実行されている場合、アニメーションのフレーム数は変化する可能性があります。あなたのゲームが私が思うように機能する場合、これにより小惑星が「束ねられる」可能性があります。したがって、フレーム レートの変動を考慮できる方法で残りのゲーム ロジック (つまり、小惑星の移動速度) を処理する予定がない限り、ここではカウンターを維持することがより良い解決策になる可能性があります。

カウンターを使用したい場合:

var creationCounter:Number = 0; // put this at class level

// Then in the ENTER_FRAME event:
creationCounter += asteroids_per_second / 30; 
while (creationCounter-- >= 1) {
    a_bitmap = new a_class();
    // etc.
}
于 2012-06-29T19:33:23.023 に答える
0

を使用TweenLiteすると、delayedCall関数を使用できます。時間またはフレームを使用できます。

// delayedCall(delay:Number, onComplete:Function, onCompleteParams:Array = null, useFrames:Boolean = false):TweenMax
TweenLite.delayedCall(30, addAstroid, null, true);

詳細については、ドキュメントを参照してください: http://www.greensock.com/as/docs/tween/com/greensock/TweenMax.html#delayedCall()

于 2012-06-30T08:54:28.583 に答える