如何让一个sprite绕一个点旋转,同时又可以实现指定旋转角度并慢慢停下的效果

首先列出sprite围绕一个点旋转的公式,这个可以自己推导,假设sprite的起始位置为(x1,y1),围绕旋转的中心点为(x0,y0),那么sprite旋转的坐标公式为:

sprite.x = (x1-x0)*Math.cos(angle) - (y1-y0)*Math.sin(angle) + x0;
sprite.y = (y1-y0)*Math.cos(angle) + (x1-x0)*Math.sin(angle) + y0;

当然也有其他的公式,这里以这个为例。

有了旋转公式接下来就是速度慢慢停下来的公式,假如最终停止的角度为endA,初始旋转速度为10度,初始角度为startA(所有角度相对Y轴顺时针计算,如90度就是与x轴平行),初始旋转位置为(x0,y0),那么旋转慢慢停下来怎么计算呢,我们给旋转角度添加一个负加速度,sprite旋转的速度为speed,其旋转速度speed每帧都减去这个加速度,直到旋转停止,也就是speed = 0;如下:

loop(){
sprite.rotation += speed;
speed -= a;
if(speed <= 0){
stop();
}
}

这里只有一个值是不确定的就是加速度a,只要求出加速度a的公式就可以指定停止位置了。a怎么计算呢,首先有个位移公式为a = (vt*vt - v0*v0)/2s,v0是初始速度,很显然这里的vt = 0,s是位移,在这里表示总共旋转多少度,假设转一圈再停止到endA,那么s = 360 + endA - startA,这里要注意弧度与角度的转换,2*Math.PI=360,弧度p的角度为p1 = p*180/Math.PI,角度p的弧度为p2 = p*Math.PI/180,注意三角函数全部使用弧度,很好!到这里看下a的公式:

a = -speed0 * speed0/(2*(360 + endA - startA));

实现飞镖投到到转盘并跟随装盘旋转到指定位置的效果迎刃而解,下面是部分关键代码

飞镖射中转盘后:

if(this.dartSpr.scaleY <= 0.2){
this.isTarget = true;
// this.tempSpeed = -0.1;
let sangle = Math.atan((this.dartSpr.x - this.dialCenterX)/(this.dialCenterY - this.dartSpr.y));
//求需要旋转的角度 注意弧度转角度
let tangle = 360 + this.targetAngle - sangle*180/Math.PI;;
let aspeed = this.tempRotation * this.tempRotation/(2*tangle);
this.tempSpeed = -1*aspeed;
}

loop:

private frameLoop(){
if(!this.isGameStart) return;
this.dialSpr.rotation += this.tempRotation; if(this.isTarget){
this.targetPoint = new egret.Point(this.dartSpr.x,this.dartSpr.y);
let tempx = this.targetPoint.x - this.dialCenterX;
let tempy = this.targetPoint.y - this.dialCenterY;
let angle = this.tempRotation*Math.PI/180;
this.dartSpr.x = tempx*Math.cos(angle) - tempy*Math.sin(angle) + this.dialCenterX;
this.dartSpr.y = tempy*Math.cos(angle) + tempx*Math.sin(angle) + this.dialCenterY;
}
this.tempRotation += this.tempSpeed;
if(this.tempRotation <= 0){
this.tempRotation = 0;
}
}

其中每次都会把上次的sprite的位置重新赋值给targetPoint,是为了实现持续的旋转,注意保持转盘与sprite的角速度一致。

如果可以,我愿意重新回到高中,去研究研究那个加速度以及曲线行驶的历史事迹,然后毕业不考大学,直接去搬砖,至少我知道怎么把砖以抛物线的轨迹扔到指定的位置,到时所有搬砖的都会对我刮目相看。

咦。。走神了!我的这个分享是用的ts,egret编辑器,效果就不展示了。

如果对同行能有帮助,这比搬砖强多了!

如何让一个sprite绕一个点旋转,同时又可以实现指定旋转角度并慢慢停下的效果的更多相关文章

  1. 关于actionscript中新建一个sprite,设置大小(宽高)的问题。

    有一定as3开发经验的童鞋应该知道,新建一个sprite,是无法设置大小的,即时设置了,也不会生效,宽高还是为0,据说反而有副作用(http://www.cnblogs.com/yjmyzz/arch ...

  2. ZeroMQ接口函数之 :zmq_connect - 由一个socket创建一个对外连接

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_connect zmq_connect(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_c ...

  3. ZeroMQ接口函数之 :zmq_msg_send – 从一个socket发送一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_msg_send zmq_msg_send(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  4. php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名

    1. current() 函数返回数组中的当前元素的值. 每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素. end() - 将内部指针指向数组中 ...

  5. 一个section刷新 一个cell刷新

    一个section刷新   一个cell刷新 //一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tabl ...

  6. Java实现点击一个Jlabel增加一个Jlabel的小功能

    当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...

  7. extjs5 一个容器中有几个组件公用一个控制器和一个模型

    Ext.define('TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to v ...

  8. 当一个类、一个实例域、方法被定义为private、public 时意味着什么

    1.设计private public的原因 2.当一个类.一个实例域.方法被定义为private.public 时意味着什么

  9. threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个

    threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错

随机推荐

  1. jmeter-ERROR o.a.j.p.j.c.DataSourceElement: JDBC data source already defined for: 报错原因

    转载自:https://www.cnblogs.com/zhangfeivip/p/9450403.html Jmeter 多个threadgroup 中的配置元件会一次性进行初始化   例如3个th ...

  2. 【Python】【demo实验2】【打印乘法口诀表】

    打印乘法口诀表 源代码: # encoding=utf-8 for i in range(1,10): print("\n") for j in range(1,10): if i ...

  3. P4942小凯的数字

    给定一个序列,如12345 56789 1011121314等,输出对其取余9的结果. 那么我们需要明白一个定理,一个序列对一个数的取余结果等于它各位之和取余那个数的结果.证明似乎是这样∑i=0n​a ...

  4. [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)

    [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...

  5. cmd_操作MySQL数据库

    建议用 TXT 文档来写代码 然后粘贴至cmd命令直接运行创建students库,表名为student,表包含以下字段: id(主键) name(姓名) age(年龄) sex(性别) sc(综合积分 ...

  6. python-day30(正式学习)

    单例模式 什么是单例模式 单例模式:基于某种方法实例化多次得到实例是同一个 为什么用单例模式 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例 用类方法来实现 ...

  7. MySQL中文正常而mybatis查询出现乱码的解决方案

    解决方案是在spring-mvc.xml文件中,加入 <mvc:annotation-driven> <mvc:message-converters> <bean cla ...

  8. Antdesign Form 实现页面控件的赋值加载

    使用Antdesign Form时,当页面加载时,需要从后台获取数据,对Form中控件的默认赋值.看似比较简单的需求,而且Antdesign 官方文档中也有相应介绍,然后对于Form 的CheckBo ...

  9. Hadoop大数据平台入门——HDFS和MapReduce

    随着硬件水平的不断提高,需要处理数据的大小也越来越大.大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪.当然我也想打上时代的便车.所以今天来学习一下大数据存储和处理. 随着数据的不断变大, ...

  10. VUE项目中使用this.$forceUpdate()强制页面重新渲染

    在使用Vue框架开发时,在函数中改变了页面中的某个值,在函数中查看是修改成功了,但在页面中没有及时刷新改变后的值,我是在使用多层v-for嵌套时出现这种问题的, 解决方法:运用 this.$force ...