cocos2d-x懶人數學函數
前一段時間完成了Android的一個項目之后,現在團隊開始做游戲開發了。隊友們經過討論過后,十分看好cocos2d-x,于是團隊又開始現學現賣了,決定做一個東西來練一下手。
在做cocos2d-x的時候,會發現一些問題。比如cocos2d-x的版本更新得太快了,網上的博文都是老版本的教程,新版本有一些方法已經廢棄或者改名了,加之cocos2d-x的書籍非常少,所以入門比較麻煩。
對于這種問題,我個人認為,最好還是看看官網的文檔,研究一下舊版和新版方法的差異,應該還是能解決問題的。
說正題,話說做游戲開發,要用到比較多的數學計算,對于程序員來說,還是用一種懶一點的方法,cocos2d-x方便開發者投機取巧...提供了很多方便的的數學函數,方便我們的數學計算。以下是在網上收集到的一些常用的數學方法,分享給大家!
數學函數:
- ccp(x, y); // 以坐標x,y創建一個向量
- ccpFromSize(s); // 以size s的width為x,height為y創建一個向量
CCPoint的加減乘除運算運算
- ccpAdd(v1, v2); // 等價 ccp(v1.x+v2.x, v1.y+v2.y);
- ccpSub(v1, v2); // 等價 ccp(v1.x-v2.x, v1.y-v2.y);
- ccpNeg(v) // 等價 ccp(-v.x, -v.y);
- ccpMult(v, s); //等價 ccp(v.x * s, v.y * s); s是個浮點數
取中點:
- ccpMidpoint(v1, v2); // 等價 ccp( (v1.x + v2.x)/2, (v1.y + v2.y)/2 );
點乘、叉乘、投影:
- ccpDot(v1, v2); // 等價 v1.x * v2.x + v1.y * v2.y;
- ccpCross(v1, v2); // 等價 v1.x * v2.y - v1.y * v2.x;
- ccpProject(v1, v2) // 返回的是向量v1在向量v2上的投影向量
求長度、距離和各自的平方值:
- ccpLength(v) // 返回向量v的長度,即點v到原點的距離
- ccpLengthSQ(v) // 返回向量v的長度的平方,即點v到原點的距離的平方
- ccpDistance(v1, v2) // 返回點v1到點v2的距離
- ccpDistanceSQ(v1, v2) // 返回點v1到點v2的距離的平方
- ccpNormalize(v) // 返回v的標準化向量,就是長度為1
旋轉、逆時針90度、順時針90度:
- ccpRotate(v1, v2); // 向量v1旋轉過向量v2的角度并且乘上向量v2的長度。當v2是一個長度為1的標準向量時就是正常的旋轉了,可以配套地用ccpForAngle
- ccpPerp(v); // 等價于 ccp(-v.y, v.x); (因為opengl坐標系是左下角為原點,所以向量v是逆時針旋轉90度)
- ccpRPerp(v); // 等價于 ccp(v.y, -v.x); 順時針旋轉90度
配套的有向量和弧度的轉換向量,還有一些角度相關的:
- ccpForAngle(a); // 返回一個角度為弧度a的標準向量
- ccpToAngle(v); // 返回向量v的弧度
- ccpAngle(a, b); // 返回a,b向量指示角度的差的弧度值
- ccpRotateByAngle(v, pivot, angle) // 返回向量v以pivot為旋轉軸點,按逆時針方向旋轉angle弧度
線段相交的檢測:
- ccpLineIntersect(p1, p2, p3, p4, &s, &t); // 返回p1為起點p2為終點線段1所在直線和p3為起點p4為終點線段2所在的直線是否相交,如果相交,參數s和t將返回交點在線段1、線段2上的比例
- // 得到s和t可以通過 p1 + s * (p2 - p1) 或 p3 + t * (p4 - p3) 求得交點。
- ccpSegmentIntersect(A, B C, D) // 返回線段A-B和線段C-D是否相交
- ccpIntersectPoint(A, B, C, D) // 返回線段A-B和線段C-D的交點
其他有用的:
- CC_RADIANS_TO_DEGREES(a); // 弧度轉角度
- CC_DEGREES_TO_RADIANS(a); // 角度轉弧度
- CCRANDOM_0_1(); // 產生0到1之間的隨機浮點數
- CCRANDOM_MINUS1_1(); // 產生-1到1之間的隨機浮點數