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

看这里:一页可以同时设置多少个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 回答
0

假设您想以随机间隔调用该函数,原因setInterval对您不起作用是在设置计时器之前计算随机数。特别是,当您调用setInterval函数表达式和计时器间隔都被计算(一次)时,函数会在计算的间隔处被调用。

换句话说,在评估您的代码时,随机数评估可能会导致 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 回答