0

私は4つの画像がランダムな順序でアニメーション化される「スライドショー」を作成しています。

たとえば、1つの画像に複数のアニメーションが連続して3回表示されるのを防ぐために、少しロジックを作成しました。

私の問題:4つの画像すべてがアニメーション化された後(クエリ「配列」が2回目にクリアされた後)、タイマーが狂ってtrace()、画像をアニメーション化せずに高いシーケンスレートで乱数が表示されます不気味だと思います。

私のコード:

var myTimer:Timer = new Timer(2500);
myTimer.addEventListener(TimerEvent.TIMER, animate);
myTimer.start();

var array:Array = new Array();
var lastNum:int;

function animate(e:TimerEvent):void {
    var num:int = getRandomNumber( 1, 4 );
    trace( num );
    if( array.indexOf( num ) < 0 && num != lastNum ) {
        myTimer.delay = 2500;
        if( num == 1 ) {
            sideImg_start_1.play(); // comment this*
        } else if( num == 2 ) {
            sideImg_start_2.play(); // comment this*
        } else if( num == 3 ) {
            sideImg_start_3.play(); // comment this*
        } else if( num == 4 ) {
            sideImg_start_4.play(); // comment this*
        }
        array.push( num );
        if( array.length == 4 ) {
            array.splice(0, 4);
            trace(" array cleared - " + array.length);
            lastNum = num;
        }
    } else {
        myTimer.delay = 100; // I've also tryed so make a higher delay
                // like 500 but its the same problem...
    }
}

function getRandomNumber( min:int, max:int ):int {
    return Math.floor( Math.random() * ( 1 + max - min ) ) + min;
}

stop();

だからみんな、あなたのすべての答えとあなたの助けに感謝します:D

アップデート:

最初に、タイマーに高速を定義する代わりに、単に「animate()」関数を呼び出して、時間を失うことなく次の番号を高速に呼び出すことを試みました。これにより、ランダムなアニメーションが奇妙に見えます。

animate(null);以前の代わりに使用しましmyTimer.delay = 100;たが、STACKOVERFLOWエラーが発生していました:P

4

1 に答える 1

1

たとえば、あなたlastNumが 4 に等しく、新しい値として 1、2、3 がある場合、無限ループになってしまいます。

4 を挿入することはできず ( と等しいためlastNum)、1、2、または 3 は既に配列に含まれているため挿入することはできません。

あなたがする必要があるのは:

if (array.length == 4) {
    array.splice(0, 4);
    lastNum = num;
} else {
    lastNum = 0; //<-- HERE
}
于 2012-09-26T00:10:20.687 に答える