AS3:如何在一个数组中使用另一个数组中的对象来测试对象

时间:2013-01-04 01:36:37

标签: actionscript-3

据我所知:

如果我想测试两个非数组对象,则代码为:

if(player.hitTestObject(enemy))
{
}

如果我使用数组中的每个对象测试非数组对象,那么相同的代码也可以工作。

但是如果我想用一个第二个数组中的每个对象来测试一个数组中的每个对象,我该怎么办?

3 个答案:

答案 0 :(得分:1)

这是一个资源友好的,如果你想知道的是 ANY 项目是否 ANY 其他项目:

public function anyItemWasHit( arr1:Array, arr2:Array ) : Boolean {
    for each( var item:DisplayObject in arr1) 
        if( itemHitArrItem( item, arr2 ) ) 
            return true;
    return false;
}

private function itemHitArrItem( item:DisplayObject, arr:Array ) : Boolean {
    for each( var arrItem:DisplayObject in arr ) 
        if( item.hitTestObject( arrItem ) )
            return true;
    return false;
}

根据前面的示例,这里有一个返回所有项目的数组,其中包含 ANY 其他项目:

public function itemsThatHitOtherItems( arr1:Array, arr2:Array ) : Array {
    var items:Array = [];
    for each( var item:DisplayObject in arr1 )
        if( itemHitArrItem( item, arr2) )
            items[items.length] = item;
    return items;
}

最后,一个返回所有对的数组(击中另一个项目的项目, AND 被击中的项目):

public function allPairsThatHitEachOther( arr1:Array, arr2:Array ) : Array {
    var pairs:Array = [];
    for each( var item:DisplayObject in arr1 ) {
        var itemPairs:Array = allPairsForItem( item, arr2 );
        if ( itemPairs.length > 0 ) 
            pairs = pairs.concat( itemPairs );
    }
    return pairs;
}

private function allPairsForItem( item:DisplayObject, array:Array ) : Array {
    var pairs:Array = [];
    for each( var otherItem:DisplayObject in array )
        if( item.hitTestObject( otherItem ) )
            pairs[pairs.length] = [item, otherItem];
    return pairs;
}

答案 1 :(得分:0)

我猜你真的只是询问语法。在这种情况下,它将是:

其中:

  • indexOne从0到arrayOne.length - 1(可以在for循环中)
  • indexTwo从0变为arrayTwo.length - 1(也可以是嵌套for循环)

    arrayOne [indexOne] .hitTestObject(arrayTwo [indexTwo])

答案 2 :(得分:0)

outerLoop: for (var i:int = 0; i < arr1.length; i++) {
    var obj1:DisplayObject = arr1[i] as DisplayObject;
    for (var j:int = 0; j < arr2.length; j++) {
        var obj2:DisplayObject = arr2[j] as DisplayObject;
        if (obj1.hitTestObject(obj2)) {
            // these 2 hit each other
            break outerLoop;
        }
    }
}