带有for循环的as3 hitTestObject

时间:2012-02-08 22:32:04

标签: actionscript-3 for-loop hittest

我正在构建一个pacman风格的游戏,我希望缩短我的代码。 该阶段包含92个实例名称为food1,food2等的实例。 当玩家(pacman)击中其中一个想要召唤函数的实例时。

我开始像这样写出来...它有效,但我不想复制这92次!

if( player.hitTestObject(food1) ) {
    updateScore();
}

if( player.hitTestObject(food2) ) {
    updateScore();
}

现在我正在尝试这些方面,但还没有成功。

function collectFood() {
    var i:Number;
    var pGroup:String

    for (i=0; i<92; i++) {
        pGroup= "food" + i;
        if( player.hitTestObject( MovieClip(pGroup) ) ) {
            pCount+= 1;
            MovieClip(pGroup).y=-300;
            updateScore();
        }
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

考虑将食物存放在Array

设置数组:

var food:Array = [];

将食物添加到此数组中(如果适用):

food.push(myFood);

然后您可以使用for each来浏览此数组中的项目:

for each(var i:MovieClip in food)
{
    // do stuff with i
    // i represents an instance of your food

    if(player.hitTestObject(i))
    {
        pCount ++;
        pGroup.y -= 300;

        updateScore();
    }
}

如果您在舞台上有食物并希望将它们全部添加到此阵列中,请执行以下操作:

for(var i:int = 0; i<92; i++)
{
    food.push(MovieClip(this["food"] + i));
}

我强烈建议您查看Object-oriented programming (OOP) for ActionScript-3。使用OOP,您将能够为classencapsulate为食物应该做的所有事情创建Food

它还允许您拥有更清晰,更易读的代码,特别是在上面的for each循环中,它可能如下所示:

for each(var i:Food in food)
{
    // i is an instance of Food
}

作为美学上的好处,使用像FlashDevelop这样的应用程序将根据您添加到Food类的内容提供非常有用的工具提示,例如:

enter image description here