반사 각도


11

이 "브레이크 아웃 스타일"게임이 있습니다.

나는 중앙에 대포, 대포 주변 블록 및 블록 주위에 패드가 있습니다. 게임의 모습은 다음과 같습니다.

원형 탈주 게임

픽셀 당 충돌을 일으켰 으며 다음 수학으로 블록과 접촉 할 때 " 공이 반영됩니다 ".

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

반사 각도 계산을 묘사 한 이미지

파란색 선이 공 방향이고 검은 선 (기준선)이 블록 표면입니다.

방향 은 라디안으로 표시되는 각도입니다 (물론 각도로 변환 할 수 있음).
공은 다음에 의해 움직입니다.

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

여태까지는 그런대로 잘됐다.

패드 (작은 색 블록 주위에 3 개의 어둡고 큰 블록)와 함께 내 문제가 왔습니다.

방향이 바뀌면 표면 각도가 바뀝니다.
그 이상, 공도 측면을 치면 안타의 방향과 공의 새로운 방향을 어떻게 측정 할 수 있습니까?

ps : 필요한 경우 코드와 재생 가능한 swf를 제공 할 수 있습니다.


편집하다

좋아, 각도 문제는 Vectors 로 해결 되었지만 여전히 측면과 후면 충돌에 문제가 있습니다.

그것에 대한 또 다른 질문을 열고 여기에 연결하겠습니다.


3
계정을 다시 연결하면 +100 평판 보너스를 얻게됩니다. 프로필의 계정 탭에있는 옵션이어야합니다. 하지만 그 동안 이미지를 게시하겠습니다.
Grace Note

나는 당신의 방향이 0에서 360 사이의 각도이고 수집하고 당신이 삼각법을 사용하는 공을 이동?
Jonathan Connell

@Grace, 이미지를 주셔서 대단히 감사합니다 ... @ 3nixios, 각도와 모션에 대한 자세한 정보를 추가했습니다.
NemoStein

블록 당 하나의 "방향"만 저장하는 경우 "방향"면이 항상 바깥 쪽을 향하는 4 개의 개별 블록 그룹으로 각 검은 색 블록을 다시 상상할 수 있습니다. 네 모퉁이에 가장자리가있을 수 있습니다.
horatio

답변:


8

나는 당신의 문제를 올바르게 이해했는지 확실하지 않지만, 당신이하고 싶은 것은 충돌 후 당신의 공의 결과 방향을 찾는 것이라고 가정했습니다.

화이트 보드에 가능한 해결책을 보여주는 간단한 그림이 있습니다.

여기에 이미지 설명을 입력하십시오

녹색 화살표는 공의 속도 (벡터)를 나타내며 파란색 블록은 큰 검은 색 블록을 나타내며 빨간색 화살표는 결과 벡터입니다.

첫 번째 경우, 파란색 블록의 경사는 30 도입니다. 충돌 문제를 해결하는 방법 중 하나는 모든 것을 수평 축으로 되 돌리는 것입니다. 당신이해야 할 일은 모든 것을 30도 회전시키는 것입니다 (블록의 경사) (매트릭스를 사용할 수 있습니다).

그런 다음 에서 충돌이 발생한 위치확인합니다 . 충돌이 수평이면 속도의 x 구성 요소를 반전 시킵니다. 수직 인 경우 (이 경우와 같이) y 구성 요소 ( ball.Velocity.Y = -ball.Velocity.Y)입니다. 이렇게하면 구석에 닿을 때 공이 올바르게 작동합니다 (두 구성 요소를 모두 뒤집습니다). 그런 다음 도면에없는 실제 상황으로 돌아 가야 합니다.

두 번째 경우, 공의 속도가 블록과 수직이 아닌 것을 제외하고는 같은 것입니다. 70도 회전하고 충돌이 발생한 위치를 확인한 후 해당 구성 요소를 뒤집습니다. 그런 다음 실제 상황으로 돌아갑니다.

참고 : 벡터 대신 방향을 나타내는 각도를 사용하고 있음을 알았습니다. 이러한 계산을위한 벡터를 만들거나 동일한 일반적인 아이디어를 유지하면서 각도로 작업 할 수 있습니다.

이것은 확실히 최선의 방법은 아니며 어떤 식 으로든 계산할 수 있다고 확신하지만 문제에 대한 가능한 해결책이라고 생각합니다.


고마워 ... 널 사랑 했어 잠시 후에 시도하겠습니다 ... Ahn, 당신은 벡터가 유지 / 작업하는 것이 더 나을 수 있다고 생각하십니까?
NemoStein

하하가 저의 불쌍한 기술을 용서합니다.
Jesse Emond

죄송합니다. 그림을 그리는 동안 실제로 중요한 단계를 잊어 버렸습니다. -block inclination angle적절한 충돌 응답 을 위해 뒤로 회전해야합니다 .
Jesse Emond

개인 취향에 관한 것 같지만 벡터를 많이 선호합니다. 대부분의 시간 뒤에 수학을 생각할 필요가 없으며 일반적으로 코드를 더 깨끗하게 만듭니다. 따라서 Direction(벡터로)를 유지하고 다음과 같이 공의 위치를 ​​업데이트 할 수 ball.Position += ball.Direction * ball.Speed;있습니다.
Jesse Emond

@Jesse, 나는 지금까지 이것을 할 수 없었습니다. 귀하의 방법을 완벽하게 이해했지만 구현할 수 없었습니다. 이렇게하려면 벡터를 사용하기 위해 라디안 각도를 사용하는 전체 부분을 다시 작성해야합니다 (실제로 많지는 않습니다). 지금은 다른 대안을 시도하겠습니다. 다른 대안이 있으면 시도해 드리겠습니다. 감사.
NemoStein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.