2017-11-28 6 views
0

나는 브레이크 아웃의 기본 자바 스크립트 게임을 만드는 중이라서하지만 난 정말 내가 몇 가지 문제가있어 아직 수학을 배운하지 않은 ..브레이크 아웃 게임 수학 - DX하는 각도, DY

나는 볼이 충돌 갖고 싶어 외륜은 외륜에 닿는 위치에 따라 각도에 따라 튀어 오릅니다.

방금 ​​공이 패들에 닿았을 때 각도를 0-180 도로 계산하는이 함수를 만들었습니다. 그 각도는 공이 움직여야하는 각도입니다. (공이 노의 팁에 부딪치게되면 지금 당장 문제가 될 것입니다.하지만 나중에 다루 겠습니다.) 이제 나는 공을 가져올 방법을 찾아야합니다. dx와 dy를 사용하면 삼각법을 사용해야 할 것입니다. (x는 볼의 x 좌표에 대한 변수입니다)

function getBallAngle(){ 
const maxAngle = 180; 
let hitPosition = (x - paddleX); 
let ballAngle = 0; 
const scaleToAngle = maxAngle/(paddleWidth); 

ballAngle = hitPosition * scaleToAngle; 

return ballAngle; } 

저는 약간의 수학적 도움을 부탁드립니다.

편집 : 이미 게임이 작동하지만이 기능을 사용하지 않으면 공이 외륜에서 튀어 오르는 각도가 변경됩니다.

+0

당신의 수학은 인바운드 각도와 관계없이 공이 패들의 같은 지점에 도달 할 때 순간적으로 동일한 아웃 바운드 각도를 갖게됩니다. 아웃 바운드 각도를 올바르게 계산하려면 인바운드 각도를 알아야합니다. – Forty3

+0

있음 자바 스크립트 각도는 라디안 단위입니다. 각도를 rad로 바꾸려면 angleRadians = angleDeg * (Math.PI/180)'각도를 라디안으로하면 dx = Math.cos (angleRadians)로 각도의'dx'와'dy'를 얻을 수 있습니다. '와'dy = Math.sin (angleRadians)'제로도는 3 클록에서 오른쪽으로입니다. dx와 dy 만 가지고 각도를 라디안으로'angleRadians = Math.atan2 (dy, dx)'로하고 dy를 먼저 쓰면 – Blindman67

+0

오, 공을 속도'speed'로 원하면'dx = Math.cos (angleRadians) * speed;와'dy = Math.sin (angleRadians) * speed;' – Blindman67

답변

0

는 움직이는 볼이 x와 (당신이 dxdy에 대한 요청과 암시와 같은) y 구성 요소를 모두 가지고있다보십시오. 이 값을 자바 스크립트로 작성 중이므로이 값을 ball 객체에 할당하여 모든 틱에서 (즉, 프로그램에서 현재 게임 상태를 계산하고 모든 표시 객체를 다시 렌더링 할 때마다) 참조 할 수 있도록 할 수 있습니다.

잠시 동안 우리는 패들을 다루고 있다고 가정하면, 공이 패들에 부딪 칠 때 수평 이동 계수 (x)가 바뀌지 않을 것이라고 가정 할 수 있습니다 (우리는 공을 뒤로 내리고 싶지 않습니다). 외륜에서 벗어나 라 .. 문자 그대로의 경우를 제외하고. ..). 그리고 우리가 반사 표면처럼 패들을 다루고 있기 때문에, 수직 이동 계수 (y)는 단순히 아래쪽으로 움직이는 것에서 위쪽으로 향하는 것 (-1에 의한 곱셈을 통해 가장 쉽게 달성 됨)으로 전환 할 것입니다.

따라서 "찾고자하는 각도"는 실제로 볼의 움직임 속성의 y 구성 요소를 역전 한 것입니다.

+0

공이 경기 변동을주기 위해 노면의 동일한 지점을 공격 할 때 동일한 아웃 바운드 각도를 원합니다. x가 변경되지 않으면 플레이어는 공을 그리워하지 않는다고 가정 할 때마다 같은 방식으로 게임을 실행합니다. 그래도 고마워. –

관련 문제