当前位置:编程学习 > wap >>

cocos2d-x:懒人数学函数

 前一段时间完成了Android的一个项目之后,现在团队开始做游戏开发了。队友们经过讨论过后,十分看好cocos2d-x,于是团队又开始现学现卖了,决定做一个东西来练一下手。

  在做cocos2d-x的时候,会发现一些问题。比如cocos2d-x的版本更新得太快了,网上的博文都是老版本的教程,新版本有一些方法已经废弃或者改名了,加之cocos2d-x的书籍非常少,所以入门比较麻烦。

  对于这种问题,我个人认为,最好还是看看官网的文档,研究一下旧版和新版方法的差异,应该还是能解决问题的。

 


  说正题,话说做游戏开发,要用到比较多的数学计算,对于程序员来说,还是用一种懒一点的方法,cocos2d-x方便开发者投机取巧...提供了很多方便的的数学函数,方便我们的数学计算。以下是在网上收集到的一些常用的数学方法,分享给大家!

 


  数学函数:

[c++]

ccp(x, y); // 以坐标x,y创建一个向量  
 
ccpFromSize(s); // 以size s的width为x,height为y创建一个向量 
 
ccp(x, y); // 以坐标x,y创建一个向量

ccpFromSize(s); // 以size s的width为x,height为y创建一个向量
 
  CCPoint的加减乘除运算运算

[c++]
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是个浮点数 
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是个浮点数


取中点:

[c++]
ccpMidpoint(v1, v2); // 等价 ccp( (v1.x + v2.x)/2, (v1.y + v2.y)/2 ); 
ccpMidpoint(v1, v2); // 等价 ccp( (v1.x + v2.x)/2, (v1.y + v2.y)/2 );


点乘、叉乘、投影:


[c++]
 
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上的投影向量 
 
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上的投影向量


求长度、距离和各自的平方值:


[c++]
ccpLength(v) // 返回向量v的长度,即点v到原点的距离  
 
ccpLengthSQ(v) // 返回向量v的长度的平方,即点v到原点的距离的平方  
 
ccpDistance(v1, v2) // 返回点v1到点v2的距离  
 
ccpDistanceSQ(v1, v2) // 返回点v1到点v2的距离的平方  
 
ccpNormalize(v) // 返回v的标准化向量,就是长度为1 
ccpLength(v) // 返回向量v的长度,即点v到原点的距离

ccpLengthSQ(v) // 返回向量v的长度的平方,即点v到原点的距离的平方

ccpDistance(v1, v2) // 返回点v1到点v2的距离

ccpDistanceSQ(v1, v2) // 返回点v1到点v2的距离的平方

ccpNormalize(v) // 返回v的标准化向量,就是长度为1


旋转、逆时针90度、顺时针90度:


[c++]
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度 
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度


配套的有向量和弧度的转换向量,还有一些角度相关的:


[c++]
ccpForAngle(a); // 返回一个角度为弧度a的标准向量  
 
ccpToAngle(v); // 返回向量v的弧度   
 
ccpAngle(a, b); // 返回a,b向量指示角度的差的弧度值  
 
ccpRotateByAngle(v, pivot, angle) // 返回向量v以pivot为旋转轴点,按逆时针方向旋转angle弧度 
ccpForAngle(a); // 返回一个角度为弧度a的标准向量

ccpToAngle(v); // 返回向量v的弧度

ccpAngle(a, b); // 返回a,b向量指示角度的差的弧度值

ccpRotateByAngle(v, pivot, angle) // 返回向量v以pivot为旋转轴点,按逆时针方向旋转angle弧度


线段相交的检测:


[c++]
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的交点 
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的交点


其他有用的:

[c++]
CC_RADIANS_TO_DEGREES(a);  // 弧度转角度  
CC_DEGREES_TO_RADIANS(a);  // 角度转弧度  
 
CCRANDOM_0_1();     // 产生0到1之间的随机浮点数  
CCRANDOM_MINUS1_1(); // 产生-1到1之间的随机浮点数 
CC_RADIANS_TO_DEGREES(a);  // 弧度转角度
CC_DEGREES_TO_RADIANS(a);  // 角度转弧度

CCRANDOM_0_1();     // 产生0到1之间的随机浮点数
CCRANDOM_MINUS1_1(); // 产生-1到1之间的随机浮点数

 

 

 

补充:移动开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,