2014-02-16 3 views
2

나는 브레이크 아웃을 다시 시도하고 있는데, 때로는 공이 타일을 완전히 뛰어 넘거나 잘못 튀어 나온다. 내 생각에 문제는 볼이 위쪽, 아래쪽, 또는 측면에서오고 있는지 여부를 감지하는 코드가 공의 "계단"크기가 볼의 내부에 도착할 수 있다는 사실을 설명하지 않는다는 것입니다. 타일. 이러한 버그가 발생하지 않도록 시도한 유일한 방법은 단계 크기를 줄이는 것이지만, 그 방법으로 볼을 원하는 것보다 느리게 움직일 수 있습니다. 그렇다면 볼의 속도를 동일하게 유지하면서 충돌면을 정확하게 감지 할 수 있습니까?어떻게 충돌의 측면을 감지 할 수 있습니까?

Vector2 ballCenter = new Vector2(); 
       Vector2 tileCenter = new Vector2(); 
       ballCenter = ball.getHitbox().getCenter(ballCenter); 
       tileCenter = tiles.get(i-1).getHitbox().getCenter(tileCenter); 



       if(ballCenter.y-ball.sprite.getHeight()/2>tileCenter.y){ 
        ball.velocity.y = Math.max((-1*ball.velocity.y)+2,10); 
       } 
       else if(ballCenter.y+ball.sprite.getHeight()/2<tileCenter.y){ 
        ball.velocity.y = Math.max((-1*ball.velocity.y)-1,-10); 
       } 
       else 
        ball.velocity.x *=-1; 
+0

현재 위치와 이전 위치를 유지하면 "현재 위치가 벽돌 위에 있고 이전 위치가 아래에 있었으면 공이 위쪽으로 움직입니다."등과 같이 말할 수 있습니다. 그리고 나서 공이 벽돌에 처음 닿은 위치와 결과 경로를 계산하기 위해 어떤 각도로 계산할 수 있습니다. –

답변

0

보이는대로 보면 코드가 단계가 발생할 때 볼이 현재 타일과 충돌하는지 여부를 감지합니다. 문제는 엄청나게 작은 스텝 사이즈가 아니라면 적시에 정확하게 발생하는 충돌의 가능성이 단계와 일치한다는 것입니다. 계단 사이에서 충돌이 발생하기 때문에 공을 타일을 뛰어 넘고 완전히 무시하는 것과 같은 것들이 있습니다.

충돌을 감지하는 방식을 변경하는 한 가지 해결책이 있습니다. 이 시점에서 공이 타일에 닿았는지 확인하는 대신 현재 단계와 이전 단계 사이의 시간에 공이 타일에 닿았는지 확인해야합니다.

볼의 위치와 속도가 모두 있고 정적 타일을 사용한다고 가정하기 때문에 볼의 이전 위치에서 볼의 새 위치까지의 선의 교차점을 찾는 것으로 모델링 할 수 있습니다 위치 + 속도는 충돌이 없다고 가정).

그런 다음 교차 (충돌)가 있으면 더 복잡한 처리를 사용할 수 있습니다.

// use some basic geometry to find intersections between the ball's motion vector 
// and the tiles bounding square 
if (isCollision(ball, tile)) 
{ 
    // If there is a collision then find out how far through the step it occurred 
    // i.e.: 0 = start, 1 = end, 0.5 = half way through 
    collision_time = findCollisionTime(ball, tile); 

    //process the part of the step before the collision 
    ball.x = ball.x + (ball.velocity.x * collision_time); 
    ball.y = ball.y + (ball.velocity.y * collision_time); 
    //or however you want to do it. 

    //update the velocity to for the collision 
    ball.velocity.x = ... 
    ball.velocity.y = ... 

    //process the part of the step after the collision 
    ball.x = ball.x + (ball.velocity.x * (1-collision_time)); 
    ball.y = ball.y + (ball.velocity.y * (1-collision_time)); 
} 

참고 :

그래서, 의사 코드는 다음과 같이 보일 것이다 나는 위 한 방법은 가정 만 볼 이동하고 그것은 하나 개 이상의 타일과 충돌하지 않을 것 단계. 일부 adaptation과 while 루프를 사용하여 여러 개의 충돌을 허용하는 것이 쉽습니다. 비 정적 충돌을 허용하려면 조금 더 생각해야합니다.

또는 물리 엔진에서이 모든 작업을 수행 할 수 있습니다.

+0

물리 엔진에 관해서는, 그것이 해결책이 될지 궁금해하고있었습니다. 여전히 어떻게 작동하는지 항상 잘 알고 있습니다. 감사! – user3316768

+0

@ user3316768 글쎄, 반드시 * 어떻게 * 완료,하지만 그것은 내 머리 꼭대기에서 나온거야. 덧붙여서 [libgdx 물리 엔진 위키에 대한 링크] (https://github.com/libgdx/libgdx/wiki/Physics)가 있습니다. – Alan

관련 문제