天天看點

Cocos2d-x遊戲執行個體-《跑跑跑》制作教程(第二篇)——加入主角

1.  實體父類

因為我覺得玩家和怪物會有一些共同的操作,是以我将玩家和怪物都定為一個實體,于是,我們需要一個實體類作為父類(實體檔案夾下建立Entity.h和Entity.cpp檔案):

<code>01</code>

<code>//Entity.h檔案</code>

<code>02</code>

<code>03</code>

<code>#ifndef __ENTITY_H__</code>

<code>04</code>

<code>#define __ENTITY_H__</code>

<code>05</code>

<code>06</code>

<code>#include "cocos2d.h"</code>

<code>07</code>

<code>08</code>

<code>using</code><code>namespace</code> <code>cocos2d;</code>

<code>09</code>

<code>10</code>

<code>class</code><code>Entity :</code><code>public</code><code>CCNode {</code>

<code>11</code>

<code>public</code><code>:</code>

<code>12</code>

<code>    </code><code>void</code><code>setSprite(CCSprite* mSprite);</code>

<code>13</code>

<code>14</code>

<code>protected</code><code>:</code>

<code>15</code>

<code>    </code><code>CCSprite* mSprite;</code>

<code>16</code>

<code>};</code>

<code>17</code>

<code>18</code>

<code>#endif&lt;/pre&gt;</code>

<code>19</code>

<code>&lt;pre</code><code>class</code><code>=</code><code>"cpp"</code><code>&gt;</code><code>//Entity.cpp檔案</code>

<code>20</code>

<code>21</code>

<code>#include "Entity.h"</code>

<code>22</code>

<code>23</code>

<code>void</code><code>Entity::setSprite( CCSprite* mSprite )</code>

<code>24</code>

<code>{</code>

<code>25</code>

<code>    </code><code>this</code><code>-&gt;mSprite = mSprite;</code>

<code>26</code>

<code>}</code>

實體類很簡單,目前隻有一個setSprite方法。

2. 建立玩家

現在我們需要一個Player類,雖然玩家表面上看是一個精靈,但是我們不直接讓它繼承精靈類,我們用組合的方式來做,精靈類隻是玩家的一個屬性。我們讓玩家繼承實體類(在實體檔案夾下建立Player.h和Player.cpp):

<code>//Player.h檔案</code>

<code>#ifndef __PLAYER_H__</code>

<code>#define __PLAYER_H__</code>

<code>class</code><code>Player :</code><code>public</code><code>Entity {</code>

<code>    </code><code>CREATE_FUNC(Player);</code>

<code>    </code><code>virtual</code><code>bool</code> <code>init();</code>

<code>#endif</code>

<code>1</code>

<code>//Player.cpp檔案</code>

<code>2</code>

<code>3</code>

<code>#include "Player.h"</code>

<code>4</code>

<code>5</code>

<code>bool</code><code>Player::init()</code>

<code>6</code>

<code>7</code>

<code>    </code><code>return</code><code>true</code><code>;</code>

<code>8</code>

OK,玩家有了,我們把它加到地圖裡吧~

打開我們的TollgateScene.cpp檔案,修改init方法,加入如下代碼:

<code>/* -------------- 加載玩家 --------------- */</code>

<code>    </code><code>CCSize visibleSize = CCDirector::sharedDirector()-&gt;getVisibleSize();</code>

<code>    </code><code>CCSprite* playerSprite = CCSprite::create(</code><code>"sprite/player1.png"</code><code>);</code>

<code>    </code><code>playerSprite-&gt;setPosition(ccp(100, visibleSize.height / 2));</code>

<code>    </code><code>/* 精靈添加到地圖 */</code>

<code>    </code><code>map-&gt;addChild(playerSprite);</code>

<code>    </code><code>/* 将精靈綁定到玩家對象上 */</code>

<code>    </code><code>Player* mPlayer = Player::create();</code>

<code>    </code><code>mPlayer-&gt;setSprite(playerSprite);</code>

OK,編譯運作,我們将看到我們的主角(話說這個主角是不是太醜了= =,我找不到又帥又在跑的資源)。

3. 固定玩家出生點(對象層的使用)

現在主角的坐标是在代碼裡寫死的,我們還可以更靈活一點,Tiled Map還有一個很厲害的功能,那就是:對象層。

其實沒有多神奇,就是在地圖上的某個位置設定一個對象,然後可以在代碼裡擷取這個對象的資訊,比如坐标,對了,就是要坐标~

來,打開我們的地圖編輯器,點選菜單欄的圖層,添加對象層,建立一個對象層:

或者在右下角的圖層那裡點選建立:

然後将圖層命名為“objects”,哇,好形象的名字,噗~

現在我們要繪制對象,點選菜單欄上的這個按鈕:

然後在地圖上繪制一個矩形,它代表一個對象:

接下來,我們要給這個對象命名,在矩形上右鍵,選擇對象屬性,然後命名為PlayerPoint:

OK,我們現在隻要在代碼裡取得PlayerPoint對象,再獲得它的x、y屬性就可以了。

繼續打開TollgateScene.cpp檔案,修改init函數,在設定玩家精靈坐标的前面,添加以下代碼:

<code>/* 加載對象層 */</code>

<code>    </code><code>CCTMXObjectGroup* objGroup = map-&gt;objectGroupNamed(</code><code>"objects"</code><code>);</code>

<code>    </code><code>/* 加載玩家坐标對象 */</code>

<code>    </code><code>CCDictionary* playerPointDic = objGroup-&gt;objectNamed(</code><code>"PlayerPoint"</code><code>);</code>

<code>    </code><code>float</code><code>playerX = playerPointDic-&gt;valueForKey(</code><code>"x"</code><code>)-&gt;floatValue();</code>

<code>    </code><code>float</code><code>playerY = playerPointDic-&gt;valueForKey(</code><code>"y"</code><code>)-&gt;floatValue();</code>

<code>    </code><code>/* -------------- 加載玩家 --------------- */</code>

<code>    </code><code>playerSprite-&gt;setPosition(ccp(playerX, playerY));</code>

簡單解釋一下。

CTMXObjectGroup存放了我們對象層的所有對象,map-&gt;objectGroupNamed(“objects”)就是取得了我們剛剛建立的obejects對象層裡的所有對象,當然,目前隻有一個PlayerPoint對象。

怎麼取得PlayerPoint對象呢,通過objectNamed函數來獲得,獲得之後傳回的是一個CCDictionary對象,CCDictionary是什麼東西?不知道大家用過Java沒有?和Java的HashMap是差不多的概念,就是一個key值對應一個value值,然後可以存放很多對這樣的key、value。

于是,我們從playerPointDic裡取得PlayerPoint對象的x、y坐标值,然後給玩家精靈設定坐标就好了。

來,編譯運作,我們的主角就出現在我們需要的位置了~!

本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366384,如需轉載請自行聯系原作者