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

cocos2dx中精灵的实时碰撞检测

2014-09-11 18:48 447 查看
版本2.04

由于CCSprite类中保留有当前精灵图像的具体位置以及纹理的Rect.

所以可以在update函数里逐帧进行访问计算.

代码示例如下

CCPoint* _DATA::Get_Sp_Point(CCSprite* src,int tri)
{
if(src)
{

CCPoint t_mid=src->getPosition();
int width=src->getTextureRect().getMaxX()-src->getTextureRect().getMinX();
int height=src->getTextureRect().getMaxY()-src->getTextureRect().getMinY();
switch(tri)
{
case LEFT_TOP:
t_mid.x-=width/2;
t_mid.y+=height/2;
break;
case LEFT_BOTTOM:
t_mid.x-=width/2;
t_mid.y-=height/2;
break;
case RIGHT_BOTTOM:
t_mid.x+=width/2;
t_mid.y-=height/2;
break;
case RIGHT_TOP:
t_mid.x+=width/2;
t_mid.y+=height/2;
break;
}
CCPoint* t_p=new CCPoint;
t_p->x=t_mid.x;
t_p->y=t_mid.y;
return t_p;
}
else
{
return NULL;
}
}
获取指定精灵的四个位置

之后只需要判定两个精灵的位置是否存在叠加区域即可.

bool _DATA::Judge_Crash(CCSprite* src,CCSprite* dest)
{
CCPoint* src_lb=Get_Sp_Point(src,LEFT_BOTTOM);
CCPoint* src_rt=Get_Sp_Point(src,RIGHT_TOP);
CCPoint* dest_lb=Get_Sp_Point(dest,LEFT_BOTTOM);
CCPoint* dest_rt=Get_Sp_Point(dest,RIGHT_TOP);
if(dest_lb->x>=src_lb->x&&dest_lb->x<=src_rt->x)
{
if(dest_lb->y>=src_lb->y&&dest_lb->y<=src_rt->y)//LEFT_BOTTOM
{
return true;
}
if(dest_rt->y>=src_lb->y&&dest_rt->y<=src_rt->y)//LEFT_TOP
{
return true;
}
}
if(dest_rt->x>=src_lb->x&&dest_rt->x<=src_rt->x)
{
if(dest_lb->y>=src_lb->y&&dest_lb->y<=src_rt->y)//RIGHT_BOTTOM
{
return true;
}
if(dest_rt->y>=src_lb->y&&dest_rt->y<=src_rt->y)//RIGHT_TOP
{
return true;
}
}
return false;
}

以上.方法可能有些拙劣
但是基本的实现应该是没啥问题的

不需要用到box2d的话还是够用的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2dx 碰撞检测