天天看點

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

我們的遊戲已經很像遊戲了(像?敢情它真的不是一個遊戲?),于是我們給主角加點吃的吧,老是這麼跑,沒有追求啊喂~

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-&gt;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-&gt;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-&gt;valueForKey(</code><code>"Collidable"</code><code>);</code>

<code>38</code>

<code>39</code>

<code>if</code><code>(prop-&gt;length() &gt; 0 &amp;&amp;prop-&gt;m_sString.compare(</code><code>"true"</code><code>) == 0) {</code>

<code>40</code>

<code>41</code>

<code>if</code><code>(x &gt; 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 &gt; 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-&gt;valueForKey(</code><code>"star"</code><code>);</code>

<code>70</code>

<code>71</code>

<code>72</code>

<code>73</code>

<code>/* 從障礙物層清除目前格子的物體 */</code>               <code>barrier-&gt;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-&gt;objectGroupNamed(</code><code>"objects"</code><code>);</code>

<code>/* 加載meta層 */</code>

<code>meta = map-&gt;layerNamed(</code><code>"meta"</code><code>);</code>

<code>meta-&gt;setVisible(</code><code>false</code><code>);</code>

<code>/* 加載障礙物層 */</code>

<code>barrier = map-&gt;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>

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

<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>