Tiled地圖的簡單應用

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;

}

這個寫法很多


新手一個,有些地方錯了,大家給我說一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章