对于2D来说,红色线就是垂直与多边形边的轴。
因此,如果我们要检查两多边形是否碰撞,就去检查两多边形在每个所有可能的轴上的投影是否重叠。
///
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//
bool
collision_RectWithRect(CCRect rect1, CCRect rect2)
{
//计算相交部分的矩形
//左下角坐标:( lx , ly )
//右上角坐标:( rx , ry )
float
lx = max(rect1.getMinX() , rect2.getMinX() );
float
ly = max(rect1.getMinY() , rect2.getMinY() );
float
rx = min(rect1.getMaxX() , rect2.getMaxX() );
float
ry = min(rect1.getMaxY() , rect2.getMaxY() );
//判断是否能构成小矩形
if
( lx > rx || ly > ry )
return
false
;
//矩形不相交
else
return
true
;
//发生碰撞
}
//
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//
//返回bool。相交为true
rect1.intersectsRect(rect2);
//
//
//intersectsRect()函数的源码如下:
bool
CCRect::intersectsRect(
const
CCRect& rect)
const
{
return
!( getMaxX() < rect.getMinX() ||
rect.getMaxX() < getMinX() ||
getMaxY() < rect.getMinY() ||
rect.getMaxY() < getMinY());
}
//
|
1
2
3
4
5
6
7
8
9
10
|
//
bool
collision_CircleWithCircle(CCPoint p1,
float
r1, CCPoint p2,
float
r2)
{
//计算圆心距离
float
dist = p1.getDistance(p2);
//判断两圆是否相交
return
dist < (r1+r2) ;
}
//
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
//
bool
collision_RectWithCircle(CCRect rect, CCPoint p,
float
r)
{
//获取矩形信息
//左下角坐标:( lx , ly )
//右上角坐标:( rx , ry )
float
lx = rect.getMinX();
float
ly = rect.getMinY();
float
rx = rect.getMaxX();
float
ry = rect.getMaxY();
//计算圆心到四个顶点的距离
float
d1 = p.getDistance( ccp(lx, ly) );
float
d2 = p.getDistance( ccp(lx, ry) );
float
d3 = p.getDistance( ccp(rx, ly) );
float
d4 = p.getDistance( ccp(rx, ry) );
//判断是否碰撞
//判断距离是否小于半径
if
( d1
//是否在圆角矩形的,横向矩形内
if
( p.x > (lx-r) && p.x < (rx+r) && p.y > ly && p.y < ry )
return
true
;
//是否在圆角矩形的,纵向矩形内
if
( p.x > lx && p.x < rx && p.y > (ly-r) && p.y < (ry+r) )
return
true
;
//不发生碰撞
return
false
;
}
//
|