2017-02-12 2 views
0

특정 오프셋에서 아케이드 물리 구조가 겹치는 지 확인하는 함수를 작성하려고합니다. 각 그룹의 스프라이트 통해 반복하고 overlapAtOffsetSprite를 사용하여 스프라이트 및 그룹 간 또는 제 2 개 그룹 사이에 중첩을위한 오프셋 함수 overlapAtOffset 검사에서 2 개 스프라이트 사이에 중첩을위한오프셋에서 오버랩 확인 - 페이저

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 검사 : 여기 내 코드의 각 스프라이트에. overlapAtOffsetSprite 함수는 테스트 할 때 제대로 작동하는 것으로 보이지만 overlapAtOffset과 함께 뭔가 잘못되었습니다.

미리 감사드립니다.

답변

0

오! 그것을 쳐다 본 후 나는 그 문제를 발견했다. 내가 forEach 함수의 진술은 overlapAtOffset의 줄 알았는데. 그래서이 문제를 해결하기 위해 group.children 배열을 사용하는 forEach 함수 대신에 for 루프를 사용했습니다. 또한 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.name == "group" 대신 object1.physicsType == Phaser.GROUP을 사용하는 것입니다.