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</pre></code>
<code>19</code>
<code><pre</code><code>class</code><code>=</code><code>"cpp"</code><code>></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>->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()->getVisibleSize();</code>
<code> </code><code>CCSprite* playerSprite = CCSprite::create(</code><code>"sprite/player1.png"</code><code>);</code>
<code> </code><code>playerSprite->setPosition(ccp(100, visibleSize.height / 2));</code>
<code> </code><code>/* 精靈添加到地圖 */</code>
<code> </code><code>map->addChild(playerSprite);</code>
<code> </code><code>/* 将精靈綁定到玩家對象上 */</code>
<code> </code><code>Player* mPlayer = Player::create();</code>
<code> </code><code>mPlayer->setSprite(playerSprite);</code>
OK,編譯運作,我們将看到我們的主角(話說這個主角是不是太醜了= =,我找不到又帥又在跑的資源)。
3. 固定玩家出生點(對象層的使用)
現在主角的坐标是在代碼裡寫死的,我們還可以更靈活一點,Tiled Map還有一個很厲害的功能,那就是:對象層。
其實沒有多神奇,就是在地圖上的某個位置設定一個對象,然後可以在代碼裡擷取這個對象的資訊,比如坐标,對了,就是要坐标~
來,打開我們的地圖編輯器,點選菜單欄的圖層,添加對象層,建立一個對象層:
或者在右下角的圖層那裡點選建立:
然後将圖層命名為“objects”,哇,好形象的名字,噗~
現在我們要繪制對象,點選菜單欄上的這個按鈕:
然後在地圖上繪制一個矩形,它代表一個對象:
接下來,我們要給這個對象命名,在矩形上右鍵,選擇對象屬性,然後命名為PlayerPoint:
OK,我們現在隻要在代碼裡取得PlayerPoint對象,再獲得它的x、y屬性就可以了。
繼續打開TollgateScene.cpp檔案,修改init函數,在設定玩家精靈坐标的前面,添加以下代碼:
<code>/* 加載對象層 */</code>
<code> </code><code>CCTMXObjectGroup* objGroup = map->objectGroupNamed(</code><code>"objects"</code><code>);</code>
<code> </code><code>/* 加載玩家坐标對象 */</code>
<code> </code><code>CCDictionary* playerPointDic = objGroup->objectNamed(</code><code>"PlayerPoint"</code><code>);</code>
<code> </code><code>float</code><code>playerX = playerPointDic->valueForKey(</code><code>"x"</code><code>)->floatValue();</code>
<code> </code><code>float</code><code>playerY = playerPointDic->valueForKey(</code><code>"y"</code><code>)->floatValue();</code>
<code> </code><code>/* -------------- 加載玩家 --------------- */</code>
<code> </code><code>playerSprite->setPosition(ccp(playerX, playerY));</code>
簡單解釋一下。
CTMXObjectGroup存放了我們對象層的所有對象,map->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,如需轉載請自行聯系原作者