어떻게 발사 토스 높은 수준 던져를 달성하기 위해? 포물선에서 말하기! 코코스 창조주!

게임은 종종 문제 포물선 궤도를 발생하는 연구 방법을 수학 물리학 지식, 높은 수준의 던져 던져 효과의 사용. 기사의 하단에 대한 완전한 코드를!

효과 미리보기 :

알려진 상태를 확인합니다 :

  • 발사 속도 크기에 대한 시작점 V
  • 중력 가속도 G
  • 시작 지점과 시점 이후

필요성은 얻을 수 :

  • 방출 각도 a

포물선 운동의 경우, 두 방향으로 갈 수 있습니다. 수평, 균일 한 직선 운동. 수직 방향의 일정한 가속도. 그래서 우리는 다음과 같은 공식을 그릴 수 있습니다 :

에서 tv_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;
}

위는 "높은 수준의 던져 던져 방출"기술 공유를 개발하기 위해 흰색 얼음 코코스 창조주의 사용이다. 아이디어는 메시지가 환영합니다! 당신에게 도움이 비트는 그녀의 친구들과 공유에 오신 것을 환영합니다.



데모 링크
전체 코드
참조 기사

추천

출처www.cnblogs.com/lamyoung/p/12105393.html