2012-01-24 4 views
0

가 나는 탁구 클론을하고 있는데이 방법으로 내 변수를 치료하고 있습니다 : 볼이 벽 (만 90 개도에 반영)하지만 약 안타 때 올바르게퐁 반사경 수학?

direction = a value from 0 to 2*pi 
distX = cos(direction)*speed of the ball 
distY = sin(direction)*speed of the ball 

on update: 
ball's x position += distX 
ball's y position += distY 

이미 방향의 반전을 처리 할 수 ​​있습니다 외륜? 연결 후 공의 각도와 속도를 가장 잘 처리하는 방법을 모르겠습니다.

패들의 위치에 따라 다릅니 까? 외륜이 움직이는 것이 중요합니까? etc.

나는 여기에서 수학을 다루는 합리적인 방법을 모른다.

+0

이것은 gamedev 교환에 속합니다. – erisco

답변

1

이 작업을 수행하는 데 올바른 방법이 없습니다. 당신은 코드를 작성한 사람이고, 엄격한 사양이 없으면 선호하는 방식으로 처리 할 수 ​​있습니다.

기본적으로 볼 패들 충돌은 볼 벽 충돌과 동일한 방식으로 처리 할 수 ​​있습니다. 즉 반사 각도를 계산하여 direction에 할당하면됩니다.

패들 속도에 비례하여 반사 각도를 높이려면 새 direction에 일종의 무게를 적용하면됩니다.

하지만 이는 정말로 당신에게 달렸습니다.

어쨌든 패들 속도를 처리하는 코드를 제공하면 누군가가 당신에게 추가 표시를 할 수 있습니다.

+0

지금 나는 패들 속도를 일정하게 유지하고있다. 어느 방향 으로든 움직이면 패들이 같은 속도로 움직입니다. –

+0

글쎄, 그 경우에는 볼의 속도를 높이거나 낮출 필요가 없다. 그러나 패들이 코너 근처에서 부딪 칠 경우를 대비하여 볼을 가속시킬 수 있습니다. 충돌 지점을 검색하고이를 기반으로 볼 속도를 높이는 것이 어렵지 않아야합니다. –

+0

그 밖의 관심사는 낚시입니다. 각도가 노를 치는 위치를 기준으로 변경해야합니까? 그렇다면 그것을 변경하는 합리적인 방법은 무엇입니까? –

0

당신의 패들이 직사각형이라고 생각하십니까? 간단히하기 위해, 볼은 패들의면 (즉, 모서리 나 측면이 아님)에만 닿을 수 있다고 가정합니다.

Q : 패들의 위치에 따라 달라 지나요? A : 패들이 축 정렬 된 사각형이고 볼이 그 표면에만 닿을 수 있다면 no.

Q : 패들이 움직이는 것이 중요합니까? A : 이것은 선택 사항입니다. 게임 물리학은 실제 물리학이 아니므로 게임을 가장 잘 만드는 모든 것을 자유롭게 할 수 있습니다.

첫 번째로 볼의 방향을 90 도로 회전해도 볼이 벽에서 정확하게 벗어나지 않습니다. 공이 벽을 치는 극단적 인 경우를 생각해보십시오. 공을 90도 회전하면 볼이 벽 옆에서 평행하게 이동합니다.

나는 현재 당신이하고있는 것을 믿고, 공이 수직 벽에 부딪치게되면 공의 수평 방향을 뒤집어 놓는다는 것을 조금 혼란스럽게 말했다. 이것은 물론 볼의 방향을 90도 회전시키는 것과는 다릅니다.

패들에서 공으로 속도를 전달하려면 공의 움직임을 벡터로, 패들의 움직임을 벡터로 처리합니다. 다음 두 벡터를 함께 추가합니다. 공에 얼마나 많은 속도가 전달되는지 제어하려면 계수를 사용하고 (공을 k라고 부름) 공이 일정한 속도를 유지해야하는 경우 볼의 최종 속도 벡터를 정규화합니다 x, y 구성 요소 대신 속도가 필요하지는 않습니다).

if (ball hits paddle): 
    k = 0.5; 
    // paddle only moves horizontally, which simplifies the math 
    paddle_vx = paddle_speed * paddle_xdirection; 
    ball_vx = cos(ball_direction) * speed + k*paddle_vx; 
    ball_vy = - sin(ball_direction) * speed // flips from the collision 
    ball_direction = atan2(ball_vy, ball_vx); 
    ball_speed = 100; // always constant 
+1

내가 분명히해야 할 것은 (내가 잘못 지시했기 때문이다.) 벽과 충돌 할 때 나는 그 방향을 그 부정으로 뒤집는다. 벽에 똑바로 향하고 볼을 초기화하더라도 벽 사이를 오가며 영원히 튀어 나옵니다. –