0

I'm trying to write a function that checks arcade physics bodies overlapping at a certain offset. Here's my code:

function overlapAtOffsetSprite(object1, object2, offsetX, offsetY)
{

    if (typeof(object1.body) === "undefined" || typeof(object2.body) === "undefined"){
        return false;
    }

    var bounds1 = new Phaser.Rectangle(object1.position.x + object1.body.offset.x + offsetX,
                                       object1.position.y + object1.body.offset.y + offsetY,
                                       object1.body.width, object1.body.height);
    var bounds2 = new Phaser.Rectangle(object2.position.x + object2.body.offset.x, object2.position.y +
                                       object2.body.offset.y, object2.body.width, object2.body.height);
    return Phaser.Rectangle.intersects(bounds1, bounds2);

}

function overlapAtOffset(object1, object2, offsetX, offsetY)
{

    if (object1.name == "group")
    {
        object1.forEach(function(child)
        {
            if (overlapAtOffset(child, object2, offsetX, offsetY))
                return true;
        });
    }
    else if (object2.name == "group")
    {
        object2.forEach(function(child)
        {
            if (overlapAtOffset(object1, child, offsetX, offsetY))
                return true;
        });
    }
    else
    {
        return overlapAtOffsetSprite(object1, object2, offsetX, offsetY);
    }
    return false;
}

Basically the function overlapAtOffsetSprite checks for overlapping between 2 sprites at an offset and the function overlapAtOffset checks for overlapping between a sprite and a group or between 2 groups by looping through each group's sprites and using overlapAtOffsetSprite on each sprite. The overlapAtOffsetSprite function seems to work fine when tested but something is wrong with overlapAtOffset.

Thanks in advance.

Moaz Ashraf
  • 210
  • 1
  • 3
  • 11

1 Answers1

0

Oh! After hours of staring at it I found the problem. I thought the return statement of the forEach function was the overlapAtOffset's. So to fix this problem I used a for loop instead of the forEach function using the group.children array. I also edited the overlapAtOffsetSprite to count for the anchor of the sprite. Here's the code for anyone interested:

function overlapAtOffsetSprite(object1, object2, offsetX, offsetY)
{
    if (typeof(object1.body) === "undefined" || typeof(object2.body) === "undefined"){
        return false;
    }

    var bounds1 = new Phaser.Rectangle(object1.position.x + object1.body.offset.x -
                                       object1.anchor.x * object1.width/object1.scale.x +
                                       offsetX, object1.position.y + object1.body.offset.y -
                                       object1.anchor.y * object1.height/object1.scale.y +
                                       offsetY, object1.body.width, object1.body.height);
    var bounds2 = new Phaser.Rectangle(object2.position.x + object2.body.offset.x -
                                       object2.anchor.x * object2.width/object2.scale.x,
                                       object2.position.y + object2.body.offset.y -
                                       object2.anchor.y * object2.height/object1.scale.y,
                                       object2.body.width, object2.body.height);
    return Phaser.Rectangle.intersects(bounds1, bounds2);

}

function overlapAtOffset(object1, object2, offsetX, offsetY)
{

    if (object1.name == "group")
    {
        for (var i = 0; i < object1.children.length; i++)
        {
            if (overlapAtOffset(object1.children[i], object2, offsetX, offsetY))
                return true;
        }
    }
    else if (object2.name == "group")
    {
        for (var i = 0; i < object2.children.length; i++)
        {
            if (overlapAtOffset(object1, object2.children[i], offsetX, offsetY))
                return true;
        }
    }
    else
    {
        return overlapAtOffsetSprite(object1, object2, offsetX, offsetY);
    }
    return false;
}

EDIT: Apparently I'm talking to myself but, still, I know someone might find this useful in the future. A better way to check if the object is a group or not is to use: object1.physicsType == Phaser.GROUP instead of object1.name == "group".

Moaz Ashraf
  • 210
  • 1
  • 3
  • 11