关闭

关于cocosdx加载tmx地图和一些碰撞检测的问题

标签: CCTMXTiledMap
464人阅读 评论(0) 收藏 举报

这篇文章将的是关于一些加载tmx地图和实现精灵与金币的碰撞检测的问题。

写这篇文章之前看了很多文章,是、但是个人感觉都说的不明了,所以我做出来之后就在微博上来与大家分享一个明了的方法,希望能对新手有所帮助。

首先我们需要一张地图,这张地图有一些属性:

大家都看见这张地图了,上面有地面和一些金币,我们主要关注的是金币,里面有金币和金圈还有五角星。

下面我们分别看看他们的属性:

五角星:


圆圈:


金币:



我们看见他们有一个共同的属性:jewelType

下面我们直接上代码:

       //加载地图
map=CCTMXTiledMap::create("3.tmx");
//获取金币层
layer=map->layerNamed("jewel");


       //将点击的点转化为tilemap地图上的网格坐标
       CCPoint HelloWorld::covertPointToTiledCoord(CCPoint p)  
{  
int x = p.x / map->getTileSize().width;  
int y = ((map->getMapSize().height * map->getTileSize().height) - p.y) / map->getTileSize().height;  
CCLOG("%d   %d",x,y);
return ccp(x, y);  
}


    //touch函数,注释很详细就不解释了

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{


//获取点击坐标
touchPoint=pTouch->getLocationInView();
//将点击坐标转化为GL坐标
touchPoint=CCDirector::sharedDirector()->convertToGL(touchPoint);
sprite->runAction(CCMoveTo::create(1,ccp(touchPoint.x,touchPoint.y)));


//调用covertPointToTiledCoord函数将点击点转化为tmxmap的坐标格坐标
tmxPoint=covertPointToTiledCoord(touchPoint);
//指定坐标获取GID
unsigned int m_gid = layer->tileGIDAt( tmxPoint); 
//根据GID,获得属性字典
CCDictionary *pKey=map->propertiesForGID(m_gid);
/* 取得格子的jewelType属性值 */  
//int型
 int jewelType = pKey->valueForKey("jewelType")->intValue();
 //字符型
// const CCString* prop = pKey->valueForKey("jewelType"); 
return true;
}




  //我们在update函数里面检测sprite精灵是否包含金币所在的点,是的话就removeTileAt掉

void HelloWorld::update(float delta)
{
CCRect spRect=sprite->boundingBox();
if (spRect.containsPoint(touchPoint))
{
//移除指定位置砖块对象
layer->removeTileAt(tmxPoint);
}
}

这里我们的代码就完了,由于只贴了cpp里面的代码,没有的大家可以在.h文件里面自己定义。

这里我们做的功能是:

1.加载一张tmx地图

2.获取地图里面相应的金币,圆圈和五角星的金币里面的位置

3.我们将touch里面的函数转换为map地图里面的格子坐标

4.我们点击屏幕时让精灵移动到屏幕点击的点

5.判断精灵的Rect是否包含了金币的坐标,包含了就一处金币,达到了一个吃金币的效果




本文章大到此结束,大家轻喷,,,,,,,小毅

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9239次
    • 积分:253
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    最新评论