2010-12-29 3 views
0

나는 탁구를 만들고 있는데, 4 개의 벽에서 볼을 올바르게 반사하는 알고리즘을 작성하는 것이 정말 어렵다는 것을 알고 있습니다. (나중에 득점을 처리 할 것입니다. 서쪽 + 동쪽 측면은 목표가 될 것입니다.) 그래서 그 순간 공이 박스 주위로 튀어 나오길 원합니다.상자 충돌 감지 및 수신 거부

공이 벽에 부딪혔는 지 감지하는 것은 쉽지만 새로운 각도를 계산하는 데 문제가 있습니다.

이것은 내가 지금까지 가지고 올 한 것입니다 : 단지 충돌의 절반 작동, 정말 추한 모습

 if(dstY == 0) { 
      // North wall 
      if(angle < 90) { 
       newAngle = angle + 90; 
      } else { 
       newAngle = angle - 90; 
      } 
     } else if(dstX == maxWidth) { 
      // East wall 
      if(angle < 90) { 
       newAngle = angle + 270; 
      } else { 
       newAngle = angle + 90; 
      } 
     } else if(dstY == maxHeight) { 
      // South wall 
      newAngle = angle + 90; 
     } else if(dstX == 1) { 
      // West wall 
      if(angle < 270) { 
       newAngle = angle - 90; 
      } else { 
       newAngle = angle - 270; 
      } 
     } 

. 나는 이것이 정말로 간단해야하고 여러 번 해본 적이 있어야한다고 확신한다.

내 코드에서 dstX/dstY는 X/Y 대상 좌표입니다. 왼쪽 상단에서 X = 0 및 y = 0입니다.

+0

어떻게 실패했는지 설명 할 수 있습니까? 공이 구석에서 정확히 맞으면 어떻게됩니까? –

답변

1

당신은 2 가지 방법으로 볼 수 있습니다 :

각도가 : 당신이 공에 충돌되는 각도를 알고, 그냥 180을 수행 - 새로운 각도를 찾기 위해 각도를.

그래디언트 : 아마 더 간단 할 것입니다. 당신은 매 t 밀리 세컨드마다 특정한 dY와 dX에서 공을 움직여야합니다. 벽에 부딪 치면 dY와 dX의 부호를 뒤집어서 간단히 재생할 수 있습니다. 예를 들어 오른쪽 벽을 치면 dX는 -dX가되고 dy는 계속 진행됩니다.

1

collideWalls()은 2 차원 벡터 산술을 사용하여 입자와 평평한 표면 사이의 탄성 충돌 시뮬레이션을 단순화합니다.

0

jbx의 그라디언트 방법 사용에 대한 지혜가있는 단어. dx가 반전되는 동안 공이 상자의 모서리 근처에 닿으면 dy가 볼을 위쪽 경계 위에 놓을 수 있습니다.

-1

감사합니다. @jbx, 나는 거기에 더 간단한 방법이 있다는 것을 알고있었습니다. 그러나 동쪽과 서쪽 벽과 패들 (그 벽에 있다면)에서는 작동하지 않는 것 같습니다. 하지만 이것은 동쪽과 서쪽 벽에 나를 위해 작동하는 것 같다 :

(180 - (angle + 90)) - 90. 

단지 (180-angle)에 단순화. 도움이 되길 바랍니다.

+0

그것이 단순화하는 방법이 아닙니다. – Jessy