Pikamander2
Pikamander2

Reputation: 8319

AS3: How do I hittest objects in one array with objects in another array

From what I understand:

If I want to hittest two non-array objects, the code would be:

if(player.hitTestObject(enemy))
{
}

The same code would also work if I was testing a non-array object with every object in an array.

But what do I do if I want to hittest every object in one array with every object in a second array?

Upvotes: 0

Views: 1789

Answers (3)

weltraumpirat
weltraumpirat

Reputation: 22604

Here's a resource-friendly one, if all you want to know is whether ANY of the items hit ANY other item:

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;
}

Based on the previous example, here's one that returns an array of ALL items that hit ANY other item:

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, finally, one that returns an array of all pairs (the item that hit another item, AND the item that was hit):

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;
}

Upvotes: 1

inhan
inhan

Reputation: 7470

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;
        }
    }
}

Upvotes: 0

mitim
mitim

Reputation: 3201

I'm guessing you're really just asking about the syntax. In this case it would be:

where:

  • indexOne goes from 0 to arrayOne.length - 1 (can be in a for loop)
  • indexTwo goes from 0 to arrayTwo.length - 1 (can also be in a nested for loop)

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

Upvotes: 0

Related Questions