【问题标题】:Check overlapping at offset - Phaser检查偏移处的重叠 - Phaser
【发布时间】:2017-02-13 19:38:18
【问题描述】:

我正在尝试编写一个函数来检查街机物理主体在某个偏移处重叠。这是我的代码:

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

基本上,函数overlapAtOffsetSprite 检查偏移处的两个精灵之间的重叠,而函数overlapAtOffset 通过循环遍历每个组的精灵并在每个组上使用overlapAtOffsetSprite 来检查精灵和组之间或两组之间的重叠精灵。 overlapAtOffsetSprite 函数在测试时似乎工作正常,但 overlapAtOffset 有问题。

提前致谢。

【问题讨论】:

    标签: javascript physics overlap phaser-framework


    【解决方案1】:

    哦!经过几个小时的盯着它,我发现了问题。我认为forEach 函数的return 语句是overlapAtOffset 的。所以为了解决这个问题,我使用了for 循环而不是使用group.children 数组的forEach 函数。我还编辑了overlapAtOffsetSprite 来计算精灵的锚点。这是任何有兴趣的人的代码:

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

    编辑: 显然我是在自言自语,但我知道将来有人可能会发现这很有用。检查对象是否为组的更好方法是使用:object1.physicsType == Phaser.GROUP 而不是 object1.name == "group"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2014-03-07
      • 2016-06-01
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多