您的位置:首页 > 移动开发 > Cocos引擎

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

2014-05-09 14:26 302 查看
cocos2d-x 只有Rect(方形)类,也只有方形之间的碰撞检测方法。

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

CCCircle.h文件

[cpp] view
plaincopyprint?

#pragma once

#include "cocos2d.h"

USING_NS_CC;

class CCCircle

{

public:

CCCircle(void);

CCCircle(cocos2d::CCPoint& center, float radius); //提供圆心与半径 初始化圆

~CCCircle(void);

bool intersectsRect(cocos2d::CCRect& rect) const;//是否与长方形区域相交

bool intersectsCircle(CCCircle& circle) const;//是否与圆形区域相交

private:

CC_SYNTHESIZE(cocos2d::CCPoint,m_center,MCenter);//圆心

CC_SYNTHESIZE(float,m_radius,MRadius);//半径

};

#define CCCircMake(ccPoint, radius) CCCircle::CCCircle(ccPoint, (float)(radius))

CCCircle.cpp文件

[cpp] view
plaincopyprint?

1.#include "CCCircle.h"

2.

3.#include "cocos2d.h"

4.

USING_NS_CC;

6.

7.CCCircle::CCCircle(void):

8.m_center(CCPoint(0,0)),m_radius(0)

9.{

10.}

11.

12.CCCircle::CCCircle(cocos2d::CCPoint& center, float radius):

13.m_center(center),m_radius(radius){

14.}

16.CCCircle::~CCCircle(void)

17.{

18.}

19.

20.//判断圆与方形区域是否相交

21.bool CCCircle::intersectsRect( cocos2d::CCRect& rect ) const

22.{

23. int arcR = (int)m_radius;//圆形半径

24. int arcOx = (int)m_center.x;//圆心X坐标

int arcOy = (int)m_center.y;//圆心Y坐标

26. int rectX = (int)rect.getMinX();//长方形左上角X坐标

27. int rectY = (int)rect.getMaxY();//长方形右上角Y坐标

28. int rectW = rect.getMaxX()-rectX;//长方形宽

29. int rectH = rect.getMaxY()-rectY;//长方形高

30.

31. if(((rectX-arcOx) * (rectX-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)

32. return true;

33. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)

34. return true;

if(((rectX-arcOx) * (rectX-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)

36. return true;

37. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)

38. return true;

39. //分别判断矩形4个顶点与圆心的距离是否<=圆半径;如果<=,说明碰撞成功

40.

41.

42. int minDisX = 0;

43. if(arcOy >= rectY && arcOy <= rectY + rectH){

44. if(arcOx < rectX)

minDisX = rectX - arcOx;

46. else if(arcOx > rectX + rectW)

47. minDisX = arcOx - rectX - rectW;

48. else

49. return true;

50. if(minDisX <= arcR)

51. return true;

52. }//判断当圆心的Y坐标进入矩形内时X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)这个范围内,则碰撞成功

53.

54. int minDisY = 0;

if(arcOx >= rectX && arcOx <= rectX + rectW){

56. if(arcOy < rectY)

57. minDisY = rectY - arcOy;

58. else if(arcOy > rectY + rectH)

59. minDisY = arcOy - rectY - rectH;

60. else

61. return true;

62. if(minDisY <= arcR)

63. return true;

64. }//判断当圆心的X坐标进入矩形内时Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)这个范围内,则碰撞成功

return false;

66.}

67.

68.//判断两圆是否相交

69.bool CCCircle::intersectsCircle( CCCircle& circle ) const

70.{

71. //圆心之间的距离小于两圆半径之和即相交

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. return false;

74. }

return true;

76.}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: