如何讓一個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繞一個點旋轉,同時又可以實現指定旋轉角度並慢慢停下的效果