我們的遊戲已經很像遊戲了(像?敢情它真的不是一個遊戲?),于是我們給主角加點吃的吧,老是這麼跑,沒有追求啊喂~
1.
畫點吃的物體
現在,我們又要打開我們的地圖編輯器,把下面的星星作為可以吃的物品畫到barrier地圖層上:
看看我的畫吧,依舊有大師風範~噗
2.
添加“另類”障礙物。
其實,吃的物品,也可以當成是障礙物,隻不過這個障礙物和主角碰撞之後會消失,僅此而已。
于是,我們和之前描紅格子的方式一樣,不過,這次我們要描藍色格子,選擇圖塊上的藍色格子,噢,抱歉,它是綠色的= =。右鍵,屬性,我們給綠色格子添加一個屬性,叫做“star”,屬性值為true。
然後,我們把地圖切換到meta層,在上面用綠色格子把我們的所有星星都覆寫~效果如下:
3.
讓主角把星星吃掉
其實大家到這裡應該早就知道接下來該怎麼做了,是吧,不過我還是稍微啰嗦一下哈。
打開我們Player.cpp的setSimplePosition函數,以前我們隻是取得主角目前所在地圖格子的屬性裡的Collidable屬性值,這次我們還要再多擷取一個值,那就是star的屬性值。函數稍微修改了一些,并且加了一些容錯機制:
<code>01</code>
<code>void</code> <code>Player::setSimplePosition(</code><code>int</code> <code>x, inty )</code>
<code>02</code>
<code>03</code>
<code>{</code>
<code>04</code>
<code>05</code>
<code>/* -----------------判斷是否不可通行---------------- */</code>
<code>06</code>
<code>07</code>
<code>/* 獲得目前主角在地圖中的格子位置 */</code>
<code>08</code>
<code>09</code>
<code>CCPoint tiledPos = tileCoordForPosition(ccp(x,y));</code>
<code>10</code>
<code>11</code>
<code>/* 擷取地圖格子的唯一辨別 */</code>
<code>12</code>
<code>13</code>
<code>int</code> <code>tiledGid = meta->tileGIDAt(tiledPos);</code>
<code>14</code>
<code>15</code>
<code>/* 不為0,代表存在這個格子 */</code>
<code>16</code>
<code>17</code>
<code>if</code><code>(tiledGid != 0) {</code>
<code>18</code>
<code>19</code>
<code>/*</code>
<code>20</code>
<code>21</code>
<code>擷取該地圖格子的所有屬性,目前我們隻有一個Collidable屬性,</code>
<code>22</code>
<code>23</code>
<code>格子是屬于meta層的,但同時也是屬于整個地圖的,是以在擷取格子的所有屬性時,</code>
<code>24</code>
<code>25</code>
<code>通過格子唯一辨別在地圖中取得。</code>
<code>26</code>
<code>27</code>
<code>*/</code>
<code>28</code>
<code>29</code>
<code>CCDictionary* propertiesDict = map->propertiesForGID(tiledGid);</code>
<code>30</code>
<code>31</code>
<code>if</code><code>(propertiesDict !=NULL) {</code>
<code>32</code>
<code>33</code>
<code>const</code> <code>CCString* prop = CCString::create(</code><code>""</code><code>);</code>
<code>34</code>
<code>35</code>
<code>/* 取得格子的Collidable屬性值,判斷Collidable屬性是否為true,是的話,不讓玩家移動 */</code>
<code>36</code>
<code>37</code>
<code>prop = propertiesDict->valueForKey(</code><code>"Collidable"</code><code>);</code>
<code>38</code>
<code>39</code>
<code>if</code><code>(prop->length() > 0 &&prop->m_sString.compare(</code><code>"true"</code><code>) == 0) {</code>
<code>40</code>
<code>41</code>
<code>if</code><code>(x > 0) {</code>
<code>42</code>
<code>43</code>
<code>x -= 1;</code>
<code>44</code>
<code>45</code>
<code>}</code>
<code>46</code>
<code>47</code>
<code>else</code> <code>{</code>
<code>48</code>
<code>49</code>
<code>x += 1;</code>
<code>50</code>
<code>51</code>
<code>52</code>
<code>53</code>
<code>if</code><code>(y > 0) {</code>
<code>54</code>
<code>55</code>
<code>y -= 1;</code>
<code>56</code>
<code>57</code>
<code>58</code>
<code>59</code>
<code>60</code>
<code>61</code>
<code>y += 1;</code>
<code>62</code>
<code>63</code>
<code>64</code>
<code>65</code>
<code>66</code>
<code>67</code>
<code>/* 取得格子的star屬性值,判斷是否為true,是的話,讓格子上的物體消失 */</code>
<code>68</code>
<code>69</code>
<code>prop = propertiesDict->valueForKey(</code><code>"star"</code><code>);</code>
<code>70</code>
<code>71</code>
<code>72</code>
<code>73</code>
<code>/* 從障礙物層清除目前格子的物體 */</code> <code>barrier->removeTileAt(tiledPos);</code>
<code>74</code>
<code>75</code>
<code>76</code>
<code>77</code>
<code>78</code>
<code>79</code>
<code>80</code>
<code>81</code>
<code>Entity::setSimplePosition(x,y);</code>
<code>82</code>
<code>83</code>
<code>/* 以主角為中心移動地圖 */</code>
<code>84</code>
<code>85</code>
<code>setViewPointByPlayer();</code>
<code>86</code>
<code>87</code>
做法和之前的紅色格子是一樣的,不多說了,已經注釋了。這次說明一點,我加了一個barrier變量,就是我們的障礙層,加到Entity類裡:
<code>class</code> <code>Entity :</code><code>public</code> <code>CCNode,</code><code>public</code> <code>ControllerListener {</code>
<code>public</code><code>:</code>
<code>void</code> <code>setSprite(CCSprite* mSprite);</code>
<code>void</code> <code>setController(Controller* controller);</code>
<code>/* 實作SimpleMoveListener接口的方法 */</code>
<code>virtual</code> <code>void</code> <code>setSimplePosition(intx,inty);</code>
<code>virtual</code> <code>CCPoint getCurPosition();</code>
<code>protected</code><code>:</code>
<code>CCSprite* mSprite;</code>
<code>Controller* mController;</code>
<code>/* map本來是在Player類的,現在我們放在這裡 */</code>
<code>CCTMXTiledMap* map;</code>
<code>/* 檢測碰撞的地圖層 */</code>
<code>CCTMXLayer* meta;</code>
<code>/* 障礙物層 */</code>
<code>CCTMXLayer* barrier;</code>
<code>/* 将像素坐标轉換為地圖格子坐标*/</code>
<code>CCPoint tileCoordForPosition(CCPoint pos);</code>
<code>};</code>
然後在Player.cpp的initWithTiledMap函數裡給barrier指派:
<code>/* 加載對象層的所有對象 */</code>
<code>CCTMXObjectGroup* objGroup = map->objectGroupNamed(</code><code>"objects"</code><code>);</code>
<code>/* 加載meta層 */</code>
<code>meta = map->layerNamed(</code><code>"meta"</code><code>);</code>
<code>meta->setVisible(</code><code>false</code><code>);</code>
<code>/* 加載障礙物層 */</code>
<code>barrier = map->layerNamed(</code><code>"barrier"</code><code>);</code>
OK了,編譯運作,當主角經過星星時就會吃掉它,啊,不過,隻是吃掉部分而已。這個不是很好,但是,暫時就這麼做吧。
對了,我們有沒有發現,現在主角是在星星和石頭的下面的?這是圖層次序問題,我們做一個小改動就好了,打開Player.cpp的initWithTiledMap函數,添加主角精靈到地圖的時候增加一個order參數:
<code>1</code>
<code>/* 精靈添加到地圖</code><code>版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任</code>
<code></code>
<code>0</code>
<code>分享</code>
<code>收藏</code>
<code></code><code></code>

<code>Ctrl+Enter 釋出</code>
<code>釋出</code>
<code>取消</code>
<code>文章</code>
<code>人氣</code>
<code>評論</code>
<code>點贊</code>
<code></code><code>好的文章,和好友一起分享</code>
<code>本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366260,如需轉載請自行聯系原作者</code>