Cocos2d-x遊戲執行個體-《跑跑跑》製作教程(第七篇)——添加能吃的物品以及勝利條件
笨木頭花心貢獻,啥?花心?不呢,是用心~
轉載請註明,原文地址: http://blog.csdn.net/musicvs/article/details/8203206
本文:
註:本文使用到的資源請到這裡下載:http://download.csdn.net/detail/musicvs/4769412
我們的遊戲已經很像遊戲了(像?敢情它真的不是一個遊戲?),於是我們給主角加點吃的吧,老是這麼跑,沒有追求啊喂~
1.
畫點吃的物體
現在,我們又要開啟我們的地圖編輯器,把下面的星星作為可以吃的物品畫到barrier地圖層上:
看看我的畫吧,依舊有大師風範~噗
2.
添加“另類”障礙物。
其實,吃的物品,也可以當成是障礙物,只不過這個障礙物和主角碰撞之後會消失,僅此而已。
於是,我們和之前描紅格子的方式一樣,不過,這次我們要描藍色格子,選擇圖塊上的藍色格子,噢,抱歉,它是綠色的= =。右鍵,屬性,我們給綠色格子添加一個屬性,叫做“star”,屬性值為true。
然後,我們把地圖切換到meta層,在上面用綠色格子把我們的所有星星都覆蓋~效果如下:
3.
讓主角把星星吃掉
其實大家到這裡應該早就知道接下來該怎麼做了,是吧,不過我還是稍微囉嗦一下哈。
開啟我們Player.cpp的setSimplePosition函數,以前我們只是取得主角當前所在地圖格子的屬性裡的Collidable屬性值,這次我們還要再多擷取一個值,那就是star的屬性值。函數稍微修改了一些,並且加了一些容錯機制:
void Player::setSimplePosition( int x, inty ) { /* -----------------判斷是否不可通行---------------- */ /* 獲得當前主角在地圖中的格子位置 */ CCPoint tiledPos = tileCoordForPosition(ccp(x,y)); /* 擷取地圖格子的唯一標識 */ int tiledGid = meta->tileGIDAt(tiledPos); /* 不為0,代表存在這個格子 */ if(tiledGid != 0) { /* 擷取該地圖格子的所有屬性,目前我們只有一個Collidable屬性, 格子是屬於meta層的,但同時也是屬於整個地圖的,所以在擷取格子的所有屬性時, 通過格子唯一標識在地圖中取得。 */ CCDictionary* propertiesDict = map->propertiesForGID(tiledGid); if(propertiesDict !=NULL) { const CCString* prop = CCString::create(""); /* 取得格子的Collidable屬性值,判斷Collidable屬性是否為true,是的話,不讓玩家移動 */ prop = propertiesDict->valueForKey("Collidable"); if(prop->length() > 0 &&prop->m_sString.compare("true") == 0) { if(x > 0) { x -= 1; } else { x += 1; } if(y > 0) { y -= 1; } else { y += 1; } } /* 取得格子的star屬性值,判斷是否為true,是的話,讓格子上的物體消失 */ prop = propertiesDict->valueForKey("star"); if(prop->length() > 0 &&prop->m_sString.compare("true") == 0) { /* 從障礙物層清除當前格子的物體 */ barrier->removeTileAt(tiledPos); } } } Entity::setSimplePosition(x,y); /* 以主角為中心移動地圖 */ setViewPointByPlayer(); } |
做法和之前的紅色格子是一樣的,不多說了,已經注釋了。這次說明一點,我加了一個barrier變數,就是我們的障礙層,加到Entity類裡:
class Entity : public CCNode, public ControllerListener { public: void setSprite(CCSprite* mSprite); void setController(Controller* controller); /* 實現SimpleMoveListener介面的方法 */ virtual void setSimplePosition(intx,inty); virtual CCPoint getCurPosition(); protected: CCSprite* mSprite; Controller* mController; /* map本來是在Player類的,現在我們放在這裡 */ CCTMXTiledMap* map; /* 檢測碰撞的地圖層 */ CCTMXLayer* meta; /* 障礙物層 */ CCTMXLayer* barrier; /* 將像素座標轉換為地圖格子座標*/ CCPoint tileCoordForPosition(CCPoint pos); }; |
然後在Player.cpp的initWithTiledMap函數裡給barrier賦值:
/* 載入對象層的所有對象 */ CCTMXObjectGroup* objGroup = map->objectGroupNamed("objects"); /* 載入meta層 */ meta = map->layerNamed("meta"); meta->setVisible(false); /* 載入障礙物層 */ barrier = map->layerNamed("barrier"); |
OK了,編譯運行,當主角經過星星時就會吃掉它,啊,不過,只是吃掉部分而已。這個不是很好,但是,暫時就這麼做吧。
對了,我們有沒有發現,現在主角是在星星和石頭的下面的?這是圖層次序問題,我們做一個小改動就好了,開啟Player.cpp的initWithTiledMap函數,添加主角精靈到地圖的時候增加一個order參數:
/* 精靈添加到地圖ª? */ map->addChild(playerSprite, 20); |
這樣主角就不會在下面了。
4.
加入勝利條件
本來加入勝利條件我們依舊可以使用紅色、綠色格子這種方式,再添加一個紫色格子,在地圖的最右邊縱向畫一條,然後給紫色格子加一個屬性“win”,值為true。然後當主角進入地圖的這些紫色格子的位置時,就算是勝利。
但是,由於時間關係,這篇教程實在是花了我不少時間了,我就不詳細說明了。