cocos2d-x 定义圆形类 进行圆形与方形、圆形与圆形碰撞检测

cocos2d-x 只有Rect(方形)类,也只有方形之间的碰撞检测方法。

圆形是方形以外最常用的形状,也需要与圆形或方形做碰撞检测。于是自定义圆形区域类,代码如下。

 

CCCircle.h文件

  1. #pragma once  
  2.    
  3. #include "cocos2d.h"  
  4.    
  5. USING_NS_CC;  
  6.    
  7. class CCCircle  
  8. {  
  9. public:  
  10.     CCCircle(void);  
  11.     CCCircle(cocos2d::CCPoint& center, float radius); //提供圆心与半径 初始化圆  
  12.     ~CCCircle(void);  
  13.    
  14.     bool intersectsRect(cocos2d::CCRect& rect) const;//是否与长方形区域相交  
  15.     bool intersectsCircle(CCCircle& circle) const;//是否与圆形区域相交  
  16.    
  17. private:  
  18.     CC_SYNTHESIZE(cocos2d::CCPoint,m_center,MCenter);//圆心  
  19.     CC_SYNTHESIZE(float,m_radius,MRadius);//半径  
  20. };  
  21.    
  22. #define CCCircMake(ccPoint, radius) CCCircle::CCCircle(ccPoint, (float)(radius))  


 

CCCircle.cpp文件

  1. 1.#include "CCCircle.h"  
  2. 2.   
  3. 3.#include "cocos2d.h"  
  4. 4.   
  5. USING_NS_CC;  
  6. 6.   
  7. 7.CCCircle::CCCircle(void):  
  8. 8.m_center(CCPoint(0,0)),m_radius(0)  
  9. 9.{  
  10. 10.}  
  11. 11.   
  12. 12.CCCircle::CCCircle(cocos2d::CCPoint& center, float radius):  
  13. 13.m_center(center),m_radius(radius){  
  14. 14.}  
  15.    
  16. 16.CCCircle::~CCCircle(void)  
  17. 17.{  
  18. 18.}  
  19. 19.   
  20. 20.//判断圆与方形区域是否相交  
  21. 21.bool CCCircle::intersectsRect( cocos2d::CCRect& rect ) const  
  22. 22.{  
  23. 23. int arcR = (int)m_radius;//圆形半径  
  24. 24. int arcOx = (int)m_center.x;//圆心X坐标  
  25.     int arcOy = (int)m_center.y;//圆心Y坐标  
  26. 26. int rectX = (int)rect.getMinX();//长方形左上角X坐标  
  27. 27. int rectY = (int)rect.getMaxY();//长方形右上角Y坐标  
  28. 28. int rectW = rect.getMaxX()-rectX;//长方形宽  
  29. 29. int rectH = rect.getMaxY()-rectY;//长方形高  
  30. 30.   
  31. 31. if(((rectX-arcOx) * (rectX-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)  
  32. 32.     return true;  
  33. 33. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)  
  34. 34.     return true;  
  35.     if(((rectX-arcOx) * (rectX-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)  
  36. 36.     return true;  
  37. 37. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)  
  38. 38.     return true;  
  39. 39. //分别判断矩形4个顶点与圆心的距离是否<=圆半径;如果<=,说明碰撞成功  
  40. 40.   
  41. 41.   
  42. 42. int minDisX = 0;  
  43. 43. if(arcOy >= rectY && arcOy <= rectY + rectH){  
  44. 44.     if(arcOx < rectX)  
  45.             minDisX = rectX - arcOx;  
  46. 46.     else if(arcOx > rectX + rectW)  
  47. 47.         minDisX = arcOx - rectX - rectW;  
  48. 48.     else   
  49. 49.         return true;  
  50. 50.     if(minDisX <= arcR)  
  51. 51.         return true;  
  52. 52. }//判断当圆心的Y坐标进入矩形内时X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)这个范围内,则碰撞成功  
  53. 53.   
  54. 54. int minDisY = 0;  
  55.     if(arcOx >= rectX && arcOx <= rectX + rectW){  
  56. 56.     if(arcOy < rectY)  
  57. 57.         minDisY = rectY - arcOy;  
  58. 58.     else if(arcOy > rectY + rectH)  
  59. 59.         minDisY = arcOy - rectY - rectH;  
  60. 60.     else  
  61. 61.         return true;  
  62. 62.     if(minDisY <= arcR)  
  63. 63.         return true;  
  64. 64. }//判断当圆心的X坐标进入矩形内时Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)这个范围内,则碰撞成功  
  65.     return false;  
  66. 66.}  
  67. 67.   
  68. 68.//判断两圆是否相交  
  69. 69.bool CCCircle::intersectsCircle( CCCircle& circle ) const  
  70. 70.{  
  71. 71. //圆心之间的距离小于两圆半径之和即相交  
  72. 72. if (sqrt(pow(m_center.x- circle.m_center.x,2)+pow(m_center.y-circle.m_center.y,2))>m_radius+circle.m_radius) {    
  73. 73.     return false;    
  74. 74. }    
  75.     return true;   
  76. 76.}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值