1

やあみんな私はsetIntervalでループを実行しようとしていますが、配列全体ではなくランダムな間隔を使用するように配列内の各要素が必要です...これは私がこれまでに使用しているコードです

setInterval(function() {
        for ( var j = 0; j < aliens.length; j++ ){
            aliens[j].shootIt();
        }
    }, 1000+Math.floor(Math.random() * 4000)
);

しかし、私はここでちょっと立ち往生しています...よろしくお願いします!!!

4

3 に答える 3

0

ランダムな間隔で関数を呼び出したいとするとsetInterval、タイマーが設定される前に乱数が計算されるため、うまくいきません。特に、setInterval関数式とタイマー間隔の両方を呼び出すと(1回)、計算された間隔で関数が呼び出されます。

つまり、コードを評価する場合、乱数の評価の結果は2.5秒になる可能性があります。次に、関数は2.5秒間隔で呼び出されます。

setTimeout代わりに使用する必要があります。

var shootAliens = function () {
    // code to shoot aliens goes here
    // ...
    setTimeout(shootAliens, 1000+Math.floor(Math.random() * 4000));
};

すべてのエイリアンを撃った後、このコードは1〜5秒のランダムな時間の後に次のエイリアンの射撃をスケジュールします。その撮影の後、次の撮影のために新しいランダム遅延が計算されます。

于 2012-09-09T05:22:32.920 に答える
0

ループを間隔の外側に移動してforから、反復ごとに関数を呼び出して、j間隔インスタンスごとに固定します。

var shootIntervals = []; //this goes in the "global" context of your game

for ( var j = 0; j < aliens.length; j++ ) {
    intervals(j);
}

function intervals(j) {
    shootIntervals[j] = setInterval(function() {
        if (!aliens[j]) return;
        aliens[j].shootIt();
    }, 1000+Math.floor(Math.random() * 4000));
}

//clearInterval(shootIntervals[j]) when they're destroyed

これにより、配列内の各アイテムに静的なランダム間隔が与えられます。

フィドル

于 2012-09-09T05:24:19.667 に答える
0

ここを参照してください:1ページに同時に設定できるjavascript setTimeout / setInterval呼び出しの数は? 基本的に、setIntervalの結果を変数に割り当てる必要があります。そうすることで、その変数でclearIntervalを使用できるようになります

この例では、その手法を使用しました。このようにすると、さまざまな要素に割り当てられた間隔を変更できます。最初に、保存された値があるかどうかを確認します。その場合、それらに対してclearTimeoutを呼び出します。

そこから、各ターゲットアイテムでsetIntervalを呼び出し、結果を配列に保存します。ユーザーが次にボタンを押したときにクリアできるようになります。

<!DOCTYPE html>
<html>
<head>
<title>Moving a couple of spans with different intervals</title>
<script type="text/javascript">
var myIntervals = [];
function Init()
{
    if (myIntervals.length != 0)
    {
        for (var i=0, n=myIntervals.length; i<n; i++)
        {
            clearInterval(myIntervals.pop());
        }
    }
    myIntervals.push(setInterval(function(){onMove('sp1');}, (Math.random()*500)>>0 ));
    myIntervals.push(setInterval(function(){onMove('sp2');}, (Math.random()*500)>>0 ));
    myIntervals.push(setInterval(function(){onMove('sp3');}, (Math.random()*500)>>0 ));
}

function constructStyleString(xPos, yPos)
{
    var result = "margin-top: " + yPos + "px;";
    result += "margin-left: " + xPos + "px;";
    return result;
}

function onMove(tgtId)
{
    var xPos, yPos;
    xPos = Math.random() * 640;
    yPos = Math.random() * 480;
    var elem = document.getElementById(tgtId);
    elem.setAttribute("style", constructStyleString(xPos, yPos));
}
</script>
<style>
span
{
    position: absolute;
}
</style>
</head>
<body onload="Init();">
    <button onclick="Init();">(Re)set item intervals</button>
    <span id='sp1'>This is the first item</span>
    <span id='sp2'>This is the second item</span>
    <span id='sp3'>This is the third item</span>
</body>
</html>
于 2012-09-09T05:40:05.083 に答える