如何让一个sprite绕一个点旋转,同时又可以实现指定旋转角度并慢慢停下的效果
如何让一个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绕一个点旋转,同时又可以实现指定旋转角度并慢慢停下的效果的更多相关文章
- 关于actionscript中新建一个sprite,设置大小(宽高)的问题。
有一定as3开发经验的童鞋应该知道,新建一个sprite,是无法设置大小的,即时设置了,也不会生效,宽高还是为0,据说反而有副作用(http://www.cnblogs.com/yjmyzz/arch ...
- 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 ...
- 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_ ...
- php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名
1. current() 函数返回数组中的当前元素的值. 每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素. end() - 将内部指针指向数组中 ...
- 一个section刷新 一个cell刷新
一个section刷新 一个cell刷新 //一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tabl ...
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- extjs5 一个容器中有几个组件公用一个控制器和一个模型
Ext.define('TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to v ...
- 当一个类、一个实例域、方法被定义为private、public 时意味着什么
1.设计private public的原因 2.当一个类.一个实例域.方法被定义为private.public 时意味着什么
- threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证是同一个
threadlocal精髓是为每一个线程保证一个共享对象,保证一个,保证同一个线程中是同一个共享对象. 如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错
随机推荐
- 【VS开发】进程线程及堆栈关系的总结
进程线程及堆栈关系的总结 突然想到进程的栈和线程的栈,就顺便说一下,线程的栈被自动分配到进程的内存空间中 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性. ...
- [python] a little deep learning case
from numpy import exp, array, random, dot class NeuralNetwork(): def __init__(self): random.seed(1) ...
- Flood Fill
An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...
- Eclipse中格式化代码
Eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法 格式化代码的时候,右键 --> Source --> Format 能够起效,但 Ctrl+Shift+F不好使. ...
- GitHub从小白到熟悉<六>
复制或 克隆 项目
- 学习django: 庄园漫步
最近在阅读django的资料. 发现一个系列写得很好. <被解放的姜戈> 作者:Vamei 出处:http://www.cnblogs.com/vame 感谢大神指路呀~
- HTML(上)
目录 HTML(上) 浏览器 HTML 什么是HTML HTML的作用 编写HTML的规范 HTML结构 HTML常用标签 HTML标签速记 HTML(上) 浏览器 浏览器也是一个客户端 #这是一个服 ...
- mysql连接数据库时报2003错误怎么解决
mysql 2003是连接错误,连不上服务器. 你目前可以如下方法:进入控制面板->服务管理(我的是管理工具),->服务,然后找到Mysql服务,右键修改属性,改为自启动,以后再重启就没有 ...
- JS图片轮播[左右轮播
直接可以用,网上摘下来的! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- Git复习(二)之远程仓库、注册GitHub账号、SSH警告、使用GitHub
远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都 ...