Search code examples
actionscript-3hittest

How can hitTestObject work for many objects?


I have a game where player moves forward over (semi)random tiles. I want a hittest for when the player hits a certain tile.

However when the char hits one of the spawned in floor2's nothing happens.

I think this is because there are multiple 'floor2' movieclips on the stage ?

When i trace the bounds "getBounds" for floor2 the positions it shows keeps changing anyway to Hitest with all of them ?

function handleCollision( e:Event ):void {      
if(char.hitTestObject(floor2)){
trace("hit detected");
}

This is how the player spawns in:

var char:Char = new Char();
char.x = 275;
char.y = 786;
cam.addChild(char);

This is how floor2 spawns in :

if (randomRounded > 10 && randomRounded <= 50 ){
floor2 = new Floor2();
floor2.x = -8.45;
floor2.y = 786 - tileCounter;
cam.addChildAt(floor2, stage.numChildren-1);

Extra : ( RandomRounded is a randomly generated number ), ( there is a 'Var floor2:Floor2;')

please help :(


Solution

  • A variable can only ever reference up to one value. So your floor2 variable can only reference one Floor2 object. If you assign a new value, the variable will reference that value.

    What you should do is to use an Array, which can hold many objects.

    var floors:Array = [];
    
    if (randomRounded > 10 && randomRounded <= 50 ){
        floor2 = new Floor2();
        floor2.x = -8.45;
        floor2.y = 786 - tileCounter;
        cam.addChildAt(floor2, stage.numChildren-1);
        floors.push(floor2); // add the reference to the array, now floor2 can safely be overwritten by a new value without losing the previous one
    }
    

    In your function handleCollision you would then iterate over the array to test each individual floor object. Here's a quick untested example of how that could look like:

    function handleCollision( e:Event ):void 
    { 
        for (var i:uint = 0; i< floors.length; ++i)
        {     
            if(char.hitTestObject(floors[i]))
            {
                trace("hit detected");
            }
        }
    }