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

摘要:
游戏中经常会遇到抛物线轨迹问题,为此研究如何运用数学物理知识,实现高抛平抛效果。水平方向,匀速直线运动。角度大的正好是高抛效果,而角度小的是平抛效果。接着根据上面化简的一元二次方程求出tan值。//计算夹角constangle=rigidBody.linearVelocity.clone().signAngle;rigidBody.node.rotation=angle*180/Math.PI;如何控制箭不停发射?添加一个定时器就可以不停发射弓箭了。this.schedule;根据不同的发射方式,选择不同的发射线性速度就可以了。this._linearVelocity_2.clone():this._linearVelocity_1.clone()constrigidBody_arrow=this._all_arrows[this._index++%this._all_arrows.length];rigidBody_arrow.node.setPosition;rigidBody_arrow.linearVelocity=linearVelocity;}以上为白玉无冰使用CocosCreator开发"平抛高抛发射"的技术分享。

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

效果预览:

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

先确认已知条件:

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

需要求出:

  • 发射角度 a

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

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

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

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

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

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

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

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

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

接着看看代码吧。先通过两点的坐标确定水平位移 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 开发"平抛高抛发射"的技术分享。有想法欢迎留言!如果这篇对你有点帮助,欢迎分享给身边的朋友。


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


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

免责声明:文章转载自《如何实现高抛平抛发射?从抛物线说起!Cocos Creator!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Centos6.5安装中文支持和中文输入法初识 QML 和 Qt Quick下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ant design vue 获取上传图片的像素

获取图片的像素大小,使用上传文件之前的钩子 beforeUpload,参数为上传的文件。 <a-upload name="file" list-type="picture-card" :show-upload-list="false" :multiple="false" :b...

前端面试常考题:JS垃圾回收机制

摘要:众所周知,应用程序在运行过程中需要占用一定的内存空间,且在运行过后就必须将不再用到的内存释放掉,否则就会出现下图中内存的占用持续升高的情况,一方面会影响程序的运行速度,另一方面严重的话则会导致整个程序的崩溃。 众所周知,应用程序在运行过程中需要占用一定的内存空间,且在运行过后就必须将不再用到的内存释放掉,否则就会出现下图中内存的占用持续升高的情况,...

在C#中快速查询文件

相信使用过Everything的人都对其超快的搜索速度印象非常深刻,它的主要原理是通过扫描NTFS磁盘的USN Journal读取的文件列表,而不是磁盘目录,由于USN Journal非常小,因此能实现快速搜索。在CodePlex上也有人对这个功能进行了.Net的封装:MFT Scanner in VB.NET。 由于.Net程序的Dll基本上是通用的,在...

Educational Codeforces Round 40 (Rated for Div. 2)

A. Diagonal Walking Mikhail walks on a 2D plane. He can go either up or right. You are given a sequence of Mikhail's moves. He thinks that this sequence is too long and he wants t...

vue 调用本地json配置

在webpack.dev.conf.js文件中 /*----------------jsonServer---------*/ /*引入json-server*/const jsonServer = require('json-server') /*搭建一个server*/const apiServer =jsonServer.create() /*将d...

椭圆曲线密码学在OpenSSL中的实现

有限域上的椭圆曲线 这里略去有限域、射影几何等数学背景介绍。先给出实数域空间上椭圆曲线的一般形式: [y^2z + a_1xyz + a_3yz^2 = x^3 + a_2x^2z + a_4xz^2 + a_6z^3 ] 以上式子中,(x,y,z)均为变元。而令(z=1), 则可以得到平面上的椭圆曲线(Ep(x,y))。 对平面上椭圆曲线上的点P,...