天天看點

Cocos2d-x遊戲執行個體-《跑跑跑》制作教程(第五篇)——主角上下移動

嗯,至此我們的《跑跑跑》遊戲已經基本完成了…才怪啊喂~!

來,主角不能隻往前跑,我們得讓他可以上下跑。

1. 制作新的移動控制器

我們要改變主角的移動行為,這很簡單,因為聰明的我們早就料到了客戶的需求是随時改變的(噗,那個客戶說的是我麼?),是以,我們使用了組合的方式。

現在是見證組合有多強大的時候了!我們隻需要建立一個控制器,然後替換掉原來的SimpleMoveController,綁定到主角身上,就OK了~

2. 三方移動控制器

這個新的移動控制器可以往前、往上、往下移動,是以我給它命名為三方控制器。英文名叫做SanFangController,噗,開玩笑的,還是叫做ThreeDirectionController吧~

首先,我有個糟糕的事情想告訴大家,我們要修改Controller.h檔案:

其實沒有修改什麼,就是把Controller的父類由CCNode改為CCLayer。為什麼呢?因為我們的新控制器希望獲得螢幕觸摸事件,而CCNode是擷取不了這個事件的。

  好,我們來建立三方移動控制器吧:

<code>01</code>

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

<code>02</code>

<code>03</code>

<code>#ifndef __THREE_DIRECTION_CONTROLLER_H__</code>

<code>04</code>

<code>#define __THREE_DIRECTION_CONTROLLER_H__</code>

<code>05</code>

<code>06</code>

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

<code>07</code>

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

<code>08</code>

<code>09</code>

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

<code>10</code>

<code>11</code>

<code>class</code><code>ThreeDirectionController :</code><code>public</code><code>Controller {</code>

<code>12</code>

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

<code>13</code>

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

<code>14</code>

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

<code>15</code>

<code>    </code><code>virtual</code><code>void</code> <code>update(</code><code>float</code><code>dt);</code>

<code>16</code>

<code>17</code>

<code>    </code><code>/* 觸屏事件 */</code>

<code>18</code>

<code>    </code><code>virtual</code><code>void</code> <code>registerWithTouchDispatcher();</code>

<code>19</code>

<code>    </code><code>virtual</code><code>bool</code> <code>ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);</code>

<code>20</code>

<code>    </code><code>virtual</code><code>void</code> <code>ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);</code>

<code>21</code>

<code>    </code><code>virtual</code><code>void</code> <code>ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);</code>

<code>22</code>

<code>23</code>

<code>    </code><code>/* 設定X方向的移動速度 */</code>

<code>24</code>

<code>    </code><code>void</code><code>setiXSpeed(</code><code>int</code><code>iSpeed);</code>

<code>25</code>

<code>26</code>

<code>    </code><code>/* 設定Y方向的移動速度*/</code>

<code>27</code>

<code>    </code><code>void</code><code>setiYSpeed(</code><code>int</code><code>iSpeed);</code>

<code>28</code>

<code>29</code>

<code>private</code><code>:</code>

<code>30</code>

<code>    </code><code>int</code><code>iXSpeed;</code>

<code>31</code>

<code>    </code><code>int</code><code>iYSpeed;</code>

<code>32</code>

<code>};</code>

<code>33</code>

<code>34</code>

<code>#endif</code>

這個是頭檔案,我們來看看主要有什麼東西。基本上和SimpleMoveController差不多,區分了X和Y方向上的速度,以及加入了觸屏事件(繼承自CCLayer)。

再來看看cpp檔案:

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

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

<code>{</code>

<code>    </code><code>this</code><code>-&gt;iXSpeed = 0;</code>

<code>    </code><code>this</code><code>-&gt;iYSpeed = 0;</code>

<code>    </code><code>/* 設定允許觸屏 */</code>

<code>    </code><code>this</code><code>-&gt;setTouchEnabled(</code><code>true</code><code>);</code>

<code>    </code><code>this</code><code>-&gt;scheduleUpdate();</code>

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

<code>}</code>

<code>void</code><code>ThreeDirectionController::update(</code><code>float</code><code>dt )</code>

<code>    </code><code>if</code><code>(mControllerListener == NULL) {</code>

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

<code>    </code><code>}</code>

<code>    </code><code>CCPoint curPos = mControllerListener-&gt;getCurPosition();</code>

<code>    </code><code>curPos.x += iXSpeed;</code>

<code>    </code><code>curPos.y += iYSpeed;</code>

<code>    </code><code>mControllerListener-&gt;setSimplePosition(curPos.x + iXSpeed, curPos.y + iYSpeed);</code>

<code>void</code><code>ThreeDirectionController::setiXSpeed(</code><code>int</code><code>iSpeed )</code>

<code>    </code><code>this</code><code>-&gt;iXSpeed = iSpeed;</code>

<code>void</code><code>ThreeDirectionController::setiYSpeed(</code><code>int</code><code>iSpeed )</code>

<code>35</code>

<code>    </code><code>this</code><code>-&gt;iYSpeed = iSpeed;</code>

<code>36</code>

<code>37</code>

<code>38</code>

<code>bool</code><code>ThreeDirectionController::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )</code>

<code>39</code>

<code>40</code>

<code>41</code>

<code>42</code>

<code>43</code>

<code>void</code><code>ThreeDirectionController::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )</code>

<code>44</code>

<code>45</code>

<code>    </code><code>/* 擷取點選的坐标 */</code>

<code>46</code>

<code>    </code><code>CCPoint touchLocation = pTouch-&gt;getLocationInView();</code>

<code>47</code>

<code>    </code><code>touchLocation = CCDirector::sharedDirector()-&gt;convertToGL(touchLocation);</code>

<code>48</code>

<code>49</code>

<code>    </code><code>/* 被控制對象的坐标 */</code>

<code>50</code>

<code>    </code><code>CCPoint pos = mControllerListener-&gt;getCurPosition();</code>

<code>51</code>

<code>52</code>

<code>    </code><code>/* 判斷是向上移動還是向下移動 */</code>

<code>53</code>

<code>    </code><code>int</code><code>iSpeed = 0;</code>

<code>54</code>

<code>    </code><code>if</code><code>(touchLocation.y &gt; pos.y) {</code>

<code>55</code>

<code>        </code><code>iSpeed = 1;</code>

<code>56</code>

<code>57</code>

<code>    </code><code>else</code><code>{</code>

<code>58</code>

<code>        </code><code>iSpeed = -1;</code>

<code>59</code>

<code>60</code>

<code>61</code>

<code>    </code><code>setiYSpeed(iSpeed);</code>

<code>62</code>

<code>63</code>

<code>64</code>

<code>void</code><code>ThreeDirectionController::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )</code>

<code>65</code>

<code>66</code>

<code>    </code><code>/* 停止Y坐标上的移動 */</code>

<code>67</code>

<code>    </code><code>setiYSpeed(0);</code>

<code>68</code>

<code>69</code>

<code>70</code>

<code>void</code><code>ThreeDirectionController::registerWithTouchDispatcher()</code>

<code>71</code>

<code>72</code>

<code>    </code><code>/* 注冊觸屏事件 */</code>

<code>73</code>

<code>    </code><code>CCDirector::sharedDirector()-&gt;getTouchDispatcher()-&gt;addTargetedDelegate(</code><code>this</code><code>, 0,</code><code>true</code><code>);</code>

<code>74</code>

首先,update函數變了一點,x和y方向上的坐标都會改變。

然後有個registerWithTouchDispatcher函數,是用于注冊觸屏事件的。

再然後最重要的是ccTouchMoved函數,根據點選螢幕的y坐标是在主角之上還是下來判斷是讓主角向上移動還是向下移動。

好了,現在!打開我們的TollgateScene.cpp的init函數,将SimpleMoveController替換為ThreeDirectionController:

<code>1</code>

<code>/* ------------ 建立玩家移動控制器 -------------- */</code>

<code>2</code>

<code>ThreeDirectionController* mSMoveControll = ThreeDirectionController::create();</code>

<code>3</code>

<code>mSMoveControll-&gt;setiXSpeed(1);</code>

<code>4</code>

<code>mSMoveControll-&gt;setiYSpeed(0);</code>

<code>5</code>

<code>6</code>

<code>/* 控制器要添加到場景中才能獲得update事件 */</code>

<code>7</code>

<code>this</code><code>-&gt;addChild(mSMoveControll);</code>

<code>8</code>

<code>9</code>

<code>mPlayer-&gt;setController(mSMoveControll);</code>

Ok~運作遊戲,成功了~好有意思的遊戲,噗~

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

繼續閱讀