据我了解:
如果我想测试两个非数组对象,代码将是:
if(player.hitTestObject(enemy))
{
}
如果我用数组中的每个对象测试一个非数组对象,同样的代码也可以工作。
但是,如果我想用第二个数组中的每个对象对一个数组中的每个对象进行命中测试,我该怎么办?
据我了解:
如果我想测试两个非数组对象,代码将是:
if(player.hitTestObject(enemy))
{
}
如果我用数组中的每个对象测试一个非数组对象,同样的代码也可以工作。
但是,如果我想用第二个数组中的每个对象对一个数组中的每个对象进行命中测试,我该怎么办?
这是一个资源友好型的,如果您只想知道任何物品是否会击中任何其他物品:
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;
}
基于前面的示例,这里有一个返回命中任何其他项目的所有项目的数组:
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;
}
最后,返回一个包含所有对的数组(击中另一个项目的项目,以及被击中的项目):
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;
}
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;
}
}
}
我猜你真的只是在问语法。在这种情况下,它将是:
在哪里:
indexTwo 从 0 变为 arrayTwo.length - 1(也可以在嵌套的 for 循环中)
arrayOne[indexOne].hitTestObject(arrayTwo[indexTwo])