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

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

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

 

CCCircle.h文件

#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文件

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.}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值