【木頭Cocos2d-x 015】遊戲執行個體-《跑跑跑》製作教程(第七篇)——添加能吃的物品以及勝利條件

來源:互聯網
上載者:User

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。然後當主角進入地圖的這些紫色格子的位置時,就算是勝利。

  但是,由於時間關係,這篇教程實在是花了我不少時間了,我就不詳細說明了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.