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的话还是够用的
由于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 精灵的碰撞检测和消灭
- cocos2dx 3.x(精灵的碰撞检测,点击移动与拖动精灵)
- cocos2dx 精灵的碰撞检测和消灭(3)
- cocos2dx3.X项目重写(四)添加地板,障碍物和碰撞检测
- DirectX游戏编程入门——第二部分(游戏编程工具箱) ——精灵编程之碰撞检测
- Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测
- Cocos2d-x 精灵碰撞检测(方法二)
- coco2dx-关于精灵的简单碰撞检测-随心
- J2ME下的游戏精灵的碰撞检测 推荐
- 不同层之间控制不同的精灵进行碰撞检测
- cocos2dx物理引擎和碰撞检测(三)
- Cocos2dx物理引擎碰撞检测总结
- 完美的像素碰撞检测(使用cocos2dx)
- cocos2dx 缩放场景以后的碰撞检测跟触摸
- cocos2dx基础篇(27)——简单碰撞检测
- VUE+WebPack游戏设计:实现碰撞检测和动画精灵
- cocos2dx碰撞检测实现
- XNA4.0学习笔记2:控制精灵和碰撞检测
- Cocos2dx 3.1.1 之 监听器、特效切换场景、动作、检测碰撞、回调函数
- cocos2dx粒子碰撞检测