游戲中的一些數學物理問題(1)


最近在做一個游戲,憤怒小鳥百戰天蟲一類的,好像叫做炮術游戲吧。然后遇到了一些數學問題,發現自己果然不擅長數學,花了不少時間。分享一下已經解決的問題。

 

已實現的內容:人物的初速度根據觸點離人物位置而變化,觸點離人物越遠,松手后人物的初速度越大,飛的越遠

 

問題:因為人物不能無限飛行。
 
需求:限制人物的行動范圍。
 
要限制人物的行動范圍,比較好的實現方法是限制人物的最大初始速度,也就是限制觸點所能賦予玩家的最大速度。
最早的代碼如下:
 
 1 var touchX = event.getLocationX();
 2 var touchY = event.getLocationY();
 3 var canvasX = 1280, canvasY = 736;
 4 
 5 var moveX = touchX - (this.player.x + 0.5 * canvasX);
 6 var moveY = touchY - (this.player.y + 0.5 * canvasY);
 7            
 8 //半徑
 9 var radius = 50;
10 if(moveX > radius){
11     moveX = radius;
12 } else if(moveX > -radius) {
13     moveX = -radius;
14 }
15 if(moveY > radius){
16     moveY = radius;
17 } else if(moveY > -radius) {
18     moveY = -radius;
19 }
20 
21 this.speed = cc.v2(-moveX*0.3, -moveY*0.3);

 

代碼中moveX、moveY是觸點相對於人物的坐標,通過這種方法限制moveX、moveY的最大值。但是這段代碼的運行效果是把moveX、moveY的范圍限制在一個邊長為2radius的正方形范圍內。正方形限制顯然是不合理的,在正方形的邊緣上各個點獲得的初速度參差不齊,在正方形的頂點獲得的初速度大得誇張。
 
理想的效果是把moveX、moveY限制在一個固定半徑的圓內。這需要用到中學的數學知識,圓錐曲線。通過百度得到圓函數: 圓的標准方程 (x-a)²+(y-b)²=r²  方程中的a、b是圓心坐標,我們以玩家中心(0,0)為圓心所以我們要用到的是x²+y²=r²
 
還要用到三角函數,因為本質上是通過限制x,y的速度在x,y軸上的投影來限制x,y的坐標的,理解這點很重要。
 
 
 
 
寫代碼的時候被圖片誤導了,而且當時對圓方程的理解也欠缺,錯誤的代碼:var sinAngle = moveY/radius; 一開是用半徑求三角函數,在圖片上來看這樣是正確的,但是實際過程中的三角函數值不能用半徑來求,因為觸碰屏幕時觸點所在的圓並不在那個固定半徑的圓上。所在的圓的半徑是   #根號(x²+y²)#  通過坐標來動態求正弦余弦。
 
 1 var touchX = event.getLocationX();
 2 var touchY = event.getLocationY();
 3 var canvasX = 1280, canvasY = 736;
 4 
 5 var moveX = touchX - (this.player.x + 0.5 * canvasX);
 6 var moveY = touchY - (this.player.y + 0.5 * canvasY);
 7 
 8 
 9 //半徑,正弦,余弦
10 var radius = 50;
11 var sinAngle = moveY/Math.sqrt(Math.pow(moveX,2)+Math.pow(moveY,2));
12 var cosAngel = moveX/Math.sqrt(Math.pow(moveX,2)+Math.pow(moveY,2));
13 
14 if(Math.sqrt(Math.pow(moveX,2)+Math.pow(moveY,2)) >= radius){
15     moveX = cosAngel*radius;
16     moveY = sinAngle*radius;
17 }
18 
19 this.speed = cc.v2(-moveX*0.3, -moveY*0.3);

 

最終實現效果:

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com