반사 각도


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.