2017-02-12 77 views
0

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

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检查2个精灵之间的重叠为通过每个组的精灵循环和使用overlapAtOffsetSprite一个精灵和一组之间或2个之间的重叠在每个精灵上。 overlapAtOffsetSprite功能似乎在测试时工作正常,但overlapAtOffset出现问题。

在此先感谢。

回答

0

哦!经过几小时的盯着看,我发现了这个问题。我认为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"