http://www.cnblogs.com/andyque/archive/2011/04/11/2012852.html
1.地圖的創建,我利用的是tiled的軟件,仿照上面的博客創建了地圖
2.地圖的加載,我用的是vs2010和cocos2dx2.0.4版本
tiled = CCTMXTiledMap::create("ortho-objects.tmx");//加載地圖
//tiled->setScale(0.8f);
this->addChild(tiled,1,111);
tiled->setPosition(ccp(0,0));
int mapwidth = tiled->getMapSize().width * tiled->getTileSize().width;
int mapheigt = tiled->getMapSize().height *tiled->getTileSize().height;
3.我的主角是一個小人,在地圖上面來回運動,動畫創建不寫了,現在寫一下我的左右移動的檢測函數,因爲瓦片的座標與屏幕的座標是不同的,屏幕的座標是以左下角爲原點,但是瓦片的座標是以左上角爲原點座標,假設地圖爲m行n列,那麼左上角座標爲(0,0),右下角的座標就爲(m-1,n-1)
void Map::playermaphcollision()
{
CCPoint playerpos = gamelayer->getPosition();
CCSize playersize = gamelayer->getContentSize();
CCTMXTiledMap *map = (CCTMXTiledMap*)getChildByTag(111);
int idexx,idexy;
//獲取佈景層
CCTMXLayer *layer = map->layerNamed("logic");
for (int playery = playerpos.y - playersize.height;playery < playerpos.y;playery++)
{
//主角在左邊界
idexx =(playerpos.x-playersize.width/2)/map->getTileSize().width;
idexy =map->getMapSize().height- (playerpos.y/map->getTileSize().height);
CCPoint pos = ccp(idexx,idexy-1);
int titleGid = layer->tileGIDAt(pos);//獲取圖層元素的gid值
if(titleGid > 0)
{
//CCDictionary的作用就是讀取xml的文件的類
CCDictionary *titledic = map->propertiesForGID(titleGid);//根據gid獲取xml裏面的屬性值
if (titledic)
{
CCString *mvalua = (CCString*)titledic->objectForKey("collion");//根據鍵值獲取value的值
if (mvalua)
{
int mv = mvalua->intValue();//轉換爲我們所需要的類型
if (mv == 2)
{
playerpos.x = (idexx+1)*map->getTileSize().width+playersize.width/2;
gamelayer->setPosition(playerpos);
}
}
}
return;
}
//右移的情況,暫時沒右移,可以忽略
idexx = (playerpos.x + playersize.width/2)/map->getTileSize().width;
idexy = map->getMapSize().height- (playerpos.y/map->getTileSize().height);
CCPoint pos1 = ccp(idexx,idexy);
int tilegid = layer->tileGIDAt(pos1);
if (tilegid > 0)
{
CCDictionary *titledic1 = map->propertiesForGID(tilegid);
if (titledic1)
{
CCString *mava1 = (CCString*)titledic1->objectForKey("collion");
int mv1 = mava1->intValue();
if (mv1 == 2)
{
playerpos.x = (idexx-1)*map->getTileSize().width-playersize.width/2;
gamelayer->setPosition(playerpos);
}
}
}
return;
}
}
4.檢測碰撞
bool Map::iscollision(CCSprite *mysprite,CCSprite *testsprite)
{
CCPoint ownpos = mysprite->getPosition();
CCPoint otherpos = testsprite->getPosition();
CCSize ownsize = mysprite->getContentSize();
CCSize othersize = testsprite->getContentSize();
CCRect ownrect = CCRectMake(ownpos.x-ownsize.width/2,ownpos.y-ownsize.height/2,ownsize.width,ownsize.height);
CCRect otherrect = CCRectMake(otherpos.x-othersize.width/2,otherpos.y-othersize.height/2,othersize.width,othersize.height);
if (ownrect.intersectsRect(otherrect))
{
return true;
}
return false;
}
這個寫法很多
新手一個,有些地方錯了,大家給我說一下