2016-09-19 3 views
1

Cocos2d-JS를 사용하여 작은 브레이크 아웃 클론을 생성 할 때, 블로킹을 성공 시키거나 1) X 또는 Y 값.오브젝트가 얼마나 많은 아이템을 하나의 오브젝트와 충돌/무효화했는지 탐지합니다.

적어도 볼 (실제로 스프라이트가있는 작은 직사각형)은 한 번에 두 개의 블록을 히트 할 때까지 작동합니다.이 시점에서 X 또는 Y 값은 두 번 무효화됩니다.

공이 튀어 나오지 않고 계속 진행되면서 매우 짧고 매우 이상한 브레이크 아웃 게임이됩니다.

얼마나 많은 항목이 공과 충돌했는지 감지하고 무시하는 방법이 있습니까?

또는 다른 방법이 있습니까?

감사합니다. (나는 당신이나 후드 아래 엔진이 requestAnimationFrame, 또는하여 setInterval을 사용한다고 가정하고 그냥 반복하고 당신이 충돌 체크를 시작하는 방법을 아는없이

if (Tools.rectsIntersect(this, g_Ball)) { 
     if (g_Ball.y < this.y || g_Ball.y > this.y) { 
      g_Ball.yDirection = g_Ball.yDirection * -1; 
     } 
     else if (g_Ball.x < this.x || g_Ball.x > this.x) { 
      g_Ball.xDirection = g_Ball.xDirection * -1; 
     } 
     this.destroyBlock(); 
} 


Tools.rectsIntersect = function (obj1, obj2) {box 
    var aRect = obj1.collideRect(); 
    var bRect = obj2.collideRect(); 
    return cc.rectIntersectsRect(aRect, bRect); 
}; 

답변

1

:

여기 내 충돌 코드입니다 벽돌 하나 하나를 가지고 테스트 할 때) 완벽한 솔루션을 제공하기가 어렵습니다. 그러나 그것이 여러분이하고있는 것으로 가정한다면 여전히 디자인 문제가 하나 남아 있습니다. 한 번에 볼을 2 블록을 칠 수 있어야합니까?

// if YES: 
var allTheBlocks = someListOfAllTheBlocks; 
var reflectInX = false; 
var reflectInY = false; 

for (var i = 0; i < allTheBlocks.length; i++) { 
    var thisBlock = allTheBlocks[i]; 
    if (Tools.rectsIntersect(thisBlock, g_Ball)) { 
     if (g_Ball.y < thisBlock.y || g_Ball.y > thisBlock.y) { 
      reflectInY = true; 
     } else if (g_Ball.x < thisBlock.x || g_Ball.x > thisBlock.x) { 
      reflectInX = true; 
     } 
     thisBlock.destroyBlock(); 
    } 
} 

if (reflectInY) { 
    g_Ball.yDirection *= -1; 
} 

if (reflectInX) { 
    g_Ball.xDirection *= -1; 
} 

//===================== 
// OR, if NO: 
var allTheBlocks = someListOfAllTheBlocks; 

for (var i = 0; i < allTheBlocks.length; i++) { 
    var thisBlock = allTheBlocks[i]; 
    if (Tools.rectsIntersect(thisBlock, g_Ball)) { 
     if (g_Ball.y < thisBlock.y || g_Ball.y > thisBlock.y) { 
      g_Ball.yDirection *= -1; 
     } else if (g_Ball.x < thisBlock.x || g_Ball.x > thisBlock.x) { 
      g_Ball.xDirection *= -1; 
     } 
     thisBlock.destroyBlock(); 
     break; 
    } 
} 
// And then if the ball has traversed too far in that frame, due to lag, or loose math, 
// make sure to manually set it's position to be outside of the block it hit. Or if you are 
// playing that your ball has some 'flex' to it, then just leave it be. 

분명히 최적화 플러스 충돌 코드에서 수행 할 수 있지만 거기에 완전히 작동합니다.

+0

cocos2D에 내장 된 cc.rectIntersectsRect 함수를 사용했습니다. 나는 그것이 어떻게 기능하는지 완전히 모르겠다. 그러나 당신은 블록을 배열에 넣는 올바른 아이디어를 가지고 있었다. 나는 충돌에 어려움을 겪었지만 때로는 방향이 바뀌지 않았지만 초기 코드에서는 지금까지 모두 방향이 바뀌 었습니다. –