AS3 - 如何将所有实例放在一个代码中进行命中测试?

时间:2016-01-11 00:28:18

标签: actionscript-3

我有2.5D游戏,因此我无法将所有碰撞对象放在movieclip容器中,因为我需要将它们保存为单独的显示对象。我在舞台上有多个实例。我不想写所有对象的所有hitTest代码:

if (player.hitTestObject(object1)
if (player.hitTestObject(object2)
if (player.hitTestObject(object2)... etc

所以我想知道如何在一个代码中hitTest所有这些实例。我在舞台上添加了实例名称,因此它们不是变量,也不是使用addChild代码添加的。

1 个答案:

答案 0 :(得分:1)

有很多方法可以减少它的繁琐。我将展示一些:

  1. 制作一个容器。您可以创建一个容器影片剪辑并将所有对象放入其中。之后这些对象仍然是单个对象(根据您在问题中的原因,不想走这条路线)。然后,您可以迭代该影片剪辑的所有子项:

    var i:int = container.numChildren;
    
    while(i--){
        if(player.hitTestObject(container.getChildAt(i) as DisplayObject)){
            //hit,  do something
        }
    }
    
  2. 将所有对象放入数组中,然后遍历该数组:

    //when you app starts:
    
    var objectArray:Array = [object1,object2,object3]//etc.
    
    //OR, if you have say object1 - object20, you could do something like this:
    
    //vector is basically the same as an array except every item has to be of the same type (on inherit from it)
    var objectArray:Vector.<DisplayObject> = new Vector.<DisplayObject>();
    for(var i:int=1;i<=20;i++){
        var obj:DisplayObject = this.getChildByName("object" + i) as DisplayObject;
        if(obj) objectArray.push(obj);
    }
    
    //THEN, later, when you do your hit test:
    
    var i:int = objectArray.length;
    while(i--){
        if(player.hitTestObject(objectArray[i])){
    
        }
    }