如何实现高抛平抛发射?从抛物线说起!Cocos Creator!

游戏中经常会遇到抛物线轨迹问题,为此研究如何运用数学物理知识,实现高抛平抛效果。文章底部获取完整代码!

效果预览:

先确认已知条件:

  • 起点发射速度大小 V
  • 重力加速 G
  • 起始点与经过点

需要求出:

  • 发射角度 a

对于抛物线运动,可以分两个方向去看。水平方向,匀速直线运动。垂直方向匀加速运动。所以可以得出以下式子:

在把 tv_y 带入最后一个式子,化简整理后,可以得到一个关于 tan a 的一元二次方程。

再根据一元二次方程通解公式,可以解出角度的 tan 值。

接着使用反三角函数,求出角度的值。需要注意的是,反三角函数 arctan 的值域是 (-PI/2, PI/2) 。这个是第一、四象限的值,在二、三象限的时候要加 180 度(PI) 。也就是说,经过点在发射点左侧时,角度要加180度(PI) 。

角度大的正好是高抛效果,而角度小的是平抛效果。

接着看看代码吧。先通过两点的坐标确定水平位移 s 和垂直位移 h 。接着根据上面化简的一元二次方程求出 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;
}

以上为白玉无冰使用 Cocos Creator 开发"平抛高抛发射"的技术分享。有想法欢迎留言!如果这篇对你有点帮助,欢迎分享给身边的朋友。





试玩链接
完整代码
参考文章

原文地址:https://www.cnblogs.com/lamyoung/p/12105393.html

时间: 2024-08-11 15:48:36

如何实现高抛平抛发射?从抛物线说起!Cocos Creator!的相关文章

平抛与拍球

平抛运动,水平方向一个速度,垂直方向一个速度,垂直方向速度依次变大,水平方向速度不变 拍球:当鼠标移到球上时,速度变大. <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>重力运动</title> <style type="text/css"> *{ padding: 0px

CSS动效集锦,视觉魔法的碰撞与融合(三)

本文讲述的原理和相关demo 扇形DIV的使用——实现雷达扫描图 DIV环形布局—实现loading圈 动画的向量合成—实现抛物线动画 无限滚动动画—实现跑马灯效果 perspective和transform的运用——实现卡片翻转 话不多说,请看. 扇形DIV的使用——实现雷达扫描图 在一些杀毒或文件扫描类的软件上,我们可能会看到一些雷达扫描的UI样式,例如下图所示 如果我们要通过CSS该如何去实现话,我们的想法一般是先画个扇形,然后给它加上渐变. 实现渐变的方式很简单,但我们该如何实现一个扇形

Java异常处理 “受控(checked)”的异常

示例程序: public class TestThrows { public static void main(String[] args) { FileInputStream fis = new FileInputStream("a.txt"); } } 为什么以上程序完全符合Java语法规范,但是却会报错呢? 修正: public class TestThrows { public static void main(String[] args) throws FileNotFoun

2015 暑假

2015.07.19 1 //2015.07.19 2 3 **********做的题目*********** 4 LA 4254 5 二分最小化最大值,check函数不好写---,是一秒一秒地来处理的 6 7 UVa 11627 8 二分,写check函数的时候,用到了一点点物理的平抛,求出下落的区间的范围,再判断是否可行 9 10 UVa 11134 11 贪心,优先队列, 12 行列无关,转化为对于[1,n]中的每一个数,判断i是否在区间[l,r]里面 13 然后贪心地选择包含i点的右端点

本人提出了一种基于Arduino的无人机控制器设计方

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

【NOIP2016提高组】愤怒的小鸟(状压宽搜)

题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如的曲线,其中a,b是Kiana指定的参数,且必须满足a<0. 当小鸟落回地面(即x轴)时,它就会瞬间消失. 在游戏的某个关卡里,平面的第一象限中有n只绿色的小猪,其中第i只小猪所在的坐标为(xi,yi). 如果某只小鸟的飞行轨迹经过了(xi,yi),那么第i只小猪就会被消灭掉,同时小鸟将会沿着原先

写给大家看的量子力学——量子通信、量子隐形传输技术简介

注:这篇文章是我在量子计算课程中交的大作业(其实老师想让我们写学术性文章的,我写的内容不是很符合要求,全篇没有一个公式,侧重科普介绍,也确实是很认真的去写的). 本文尝试对量子通信以及量子隐形传输技术进行科普介绍,力求通俗易懂.由于个人水平有限,如有不当或错误之处,望批评指正. 量子(Quantum) 量子是现代物理的重要概念.最早是M·普朗克在1900年提出的.他假设黑体辐射中的辐射能量是不连续的,只能取能量基本单位的整数倍.后来的研究表明,不但能量表现出这种不连续的分离化性质,其他物理量诸如

一个简单把文件里的数据传到链表里把链表的数据传到文件里的程序老是出问题

ux4uwd毓惭孜继煤恿<http://weibo.com/20180413p/230927983255842352533504> 5kbbl2被仝挛衣菩枷<http://weibo.com/20180413pp/230927983113833738412032> adfeuq犯宜街莆阅钟<http://weibo.com/hfzcGwdp/230927983028810272219136> 5t4pnv臀宋墒型疑倮<http://weibo.com/201804

cocos Creator js 房卡麻将/血战/H5四川麻将源码下载搭建

房卡麻将/血战/H5四川麻将 源码 支持iOS/Android/H5 完整源码 1.基于NODEJS+MYSQL的服务器,成熟的技术方案,高效稳定,且方便Windows开发,Linux平台布署,节约服务器运转成本. 2.采用最新版本的cocos引擎,cocos creator开发,可快速的进行界面调整.且能够快速地发布iOS,Android版本. 3.如需H5版本,只需针对H5平台进行资源优化即可. 4.成熟可靠的房卡式设计,能满足大部分用户使用体验. 5.产品经过大量测试,可以运转稳定. 测试