0

下記の関数の1つを1秒ごとにランダムに呼び出そうとしています。これが私が持っているコードです。

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 に答える