게임은 종종 문제 포물선 궤도를 발생하는 연구 방법을 수학 물리학 지식, 높은 수준의 던져 던져 효과의 사용. 기사의 하단에 대한 완전한 코드를!
효과 미리보기 :
알려진 상태를 확인합니다 :
- 발사 속도 크기에 대한 시작점
V
- 중력 가속도
G
- 시작 지점과 시점 이후
필요성은 얻을 수 :
- 방출 각도
a
포물선 운동의 경우, 두 방향으로 갈 수 있습니다. 수평, 균일 한 직선 운동. 수직 방향의 일정한 가속도. 그래서 우리는 다음과 같은 공식을 그릴 수 있습니다 :
에서 t
와 v_y
단순화 된 통합, 공식에 마지막 후, 당신은에 대해 얻을 수 tan a
의 이차 방정식.
용액 화학식 후 이차 방정식은 해결 될 수 각도 tan
값.
그리고 나서 삼각 함수 각도의 산출 값을 사용하여 역. 이것은 역삼 각 함수 있음을 유의해야한다 arctan
값 도메인 (-PI/2, PI/2)
. 시간의 제 1 사분면과 제 3 사분면은 180 개도 (PI)를 추가하여이, 제 1의 사분면 값이다. 즉, 상기 좌측 방출 점이 180 개도 (PI)의 각도가 증가하는 점을 통과한다.
큰 각도는 높은 던져의 효과, 그리고 작은 각도 평면 효과 던져.
그런 다음 코드를 살펴. 처음 두 좌표를 통해 수평 변위와 수직 변위의 시간을 결정한다. 차식이어서 상기 단순화에 따라 결정되는 tan
값. 마지막으로, 각도를 찾을 수 있습니다.
const s = location.x - START_POS.x;
const h = location.y - START_POS.y;
// a*t^2 + b*t + c = 0
const a = G * s / (2 * V * V);
const b = 1;
const c = a - h / s;
const delta = b * b - 4 * a * c;
if (delta >= 0) {
// 一元二次方程求根公式
const t1 = (-b + Math.sqrt(delta)) / (2 * a); // 平抛 tan 值
const t2 = (-b - Math.sqrt(delta)) / (2 * a); // 高抛 tan 值
// 二、四象限角度要加 180
const alpha1 = Math.atan(t1) + (s < 0 ? Math.PI : 0);
const alpha2 = Math.atan(t2) + (s < 0 ? Math.PI : 0);
}
여기에 물리 엔진으로, 초기 속도는 양방향으로 요구 만 총 각속도 크기를 전송해야하는 두 구성 요소는 속도의 크기를 계산할 수있다.
const v_x_1 = Math.cos(alpha1) * V;
const v_y_1 = Math.sin(alpha1) * V;
const v_x_2 = Math.cos(alpha2) * V;
const v_y_2 = Math.sin(alpha2) * V;
// 低抛线速度 保存起来
this._linearVelocity_1.x = v_x_1;
this._linearVelocity_1.y = v_y_1;
// 高抛线速度 保存起来
this._linearVelocity_2.x = v_x_2;
this._linearVelocity_2.y = v_y_2;
만 선형 속도가 충분하지 않습니다, 우리는 각 활의 각도를 조정해야합니다. 이 각도는 강체의 선 속도에 따라 산출 할 수있다. 각각의 프레임은 노드 강체의 각도를 변경 활.
// 计算夹角
const angle = rigidBody.linearVelocity.clone().signAngle(cc.v2(1, 0));
rigidBody.node.rotation = angle * 180 / Math.PI;
어떻게 방출 제어 화살표를 중지? 활을 실행 중지하고 화살표 수없는 타이머를 추가합니다.
this.schedule(this.fireArrow, 0.5, cc.macro.REPEAT_FOREVER);
전송 모드에 따라 서로 다른 전송을 그 위에 선 속도를 선택합니다.
private _index = 0;
private fireArrow() {
const linearVelocity = this.toggle_arrow.isChecked ? this._linearVelocity_2.clone() : this._linearVelocity_1.clone()
const rigidBody_arrow = this._all_arrows[this._index++ % this._all_arrows.length];
rigidBody_arrow.node.setPosition(START_POS);
rigidBody_arrow.linearVelocity = linearVelocity;
}
위는 "높은 수준의 던져 던져 방출"기술 공유를 개발하기 위해 흰색 얼음 코코스 창조주의 사용이다. 아이디어는 메시지가 환영합니다! 당신에게 도움이 비트는 그녀의 친구들과 공유에 오신 것을 환영합니다.