0

我试图每隔一秒随机调用一次下面提到的函数之一。这是我拥有的代码。

counter=Math.floor(1+Math.random()*3); // genertate random number from 1 to 3

setTimeout("startenemy"+counter, 1000); // call one function with a delay of one second

function startenemy1()
{
    trace("1");
    enemy1.gotoAndPlay(2);
}
function startenemy2()
{
    trace("2");
    enemy2.gotoAndPlay(2);
}

function startenemy3()
{
    trace("3");
    enemy3.gotoAndPlay(2);
}

在这种情况下,setTimeout 函数对我不起作用。但是如果我使用一种非常原始的方式来使用 setTimeout,它就可以正常工作。

setTimeout(startenemy1, 1000); // call one function with a delay of one second

function startenemy1()
{
trace("1");
enemy1.gotoAndPlay(2);
}

这个实现工作得很好。所以我知道我正在使用带有错误参数的 setTimeout 函数。

如果有其他方法可以实现这一点,请告诉我。

4

2 回答 2

1

setTimout 采用 Function 类型的参数。像这样的东西会起作用:

function startenemy1():void
{
    trace("1");
    enemy1.gotoAndPlay(2);
}
function startenemy2():void
{
    trace("2");
    enemy2.gotoAndPlay(2);
}

function startenemy3():void
{
    trace("3");
    enemy3.gotoAndPlay(2);
}

function startARandomEnemy():void
{
  var functions:Array = [startenemy1,startenemy2,startenemy3];
  setTimeout(functions[int(Math.random()*functions.length)], 1000); // call one function with a delay of one second
}

更好的设计是将敌人对象存储在数组中,而不是创建名为 startenemy*() 的函数。

于 2012-06-18T17:34:13.917 回答
0

您可以使用方括号语法来获取对该函数的引用:

var counter=Math.floor(1+Math.random()*3);  
var method:Function = this["startenemy"+counter];
setTimeout( method, 1000);

但是使用一个方法来启动匿名 MovieClip 并动态引用敌人的影片剪辑会更有效:

function startEnemy( mc:MovieClip ) : void {
    mc.gotoAndPlay(2);
}

var counter=Math.floor(1+Math.random()*3);  
var mc:MovieClip = this["enemy"+counter];
setTimeout( startEnemy, 1000, mc); // mc will become the first parameter
                                   // passed to startEnemy()
于 2012-06-18T18:20:54.473 回答