2017-02-12 3 views
0

Ich versuche eine Funktion zu schreiben, die Arcade-Physikkörper überprüft, die sich bei einem bestimmten Offset überlappen. Hier ist mein Code:Überlappung bei Offset überprüfen - 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; 
} 

Grundsätzlich ist die Funktion overlapAtOffsetSprite Kontrollen für überlappende zwischen 2 Sprites bei einer Offset und der Funktion overlapAtOffset Kontrollen für überlappende zwischen einem Sprit und eine Gruppe oder zwischen 2 Gruppen von durch jede Gruppe Sprites Looping und unter Verwendung von overlapAtOffsetSprite auf jedem Sprite. Die overlapAtOffsetSprite Funktion scheint beim Testen gut zu funktionieren, aber etwas stimmt nicht mit overlapAtOffset.

Vielen Dank im Voraus.

Antwort

0

Oh! Nach stundenlangem Anstarren fand ich das Problem. Ich dachte, die return Erklärung der forEach Funktion war die overlapAtOffset 's. Um dieses Problem zu beheben, verwendete ich eine for Schleife anstelle der forEach Funktion mit dem group.children Array. Ich habe auch die overlapAtOffsetSprite bearbeitet, um für den Anker des Sprites zu zählen. Hier ist der Code für alle Interessierten:

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: Offenbar ich rede mit mir selbst, aber immer noch, ich weiß, jemand könnte dies in der Zukunft nützlich sein. Eine bessere Möglichkeit zu überprüfen, ob das Objekt eine Gruppe ist oder nicht, ist zu verwenden: object1.physicsType == Phaser.GROUP statt object1.name == "group".