嗯,至此我們的《跑跑跑》遊戲已經基本完成了…才怪啊喂~!
來,主角不能隻往前跑,我們得讓他可以上下跑。
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>->iXSpeed = 0;</code>
<code> </code><code>this</code><code>->iYSpeed = 0;</code>
<code> </code><code>/* 設定允許觸屏 */</code>
<code> </code><code>this</code><code>->setTouchEnabled(</code><code>true</code><code>);</code>
<code> </code><code>this</code><code>->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->getCurPosition();</code>
<code> </code><code>curPos.x += iXSpeed;</code>
<code> </code><code>curPos.y += iYSpeed;</code>
<code> </code><code>mControllerListener->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>->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>->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->getLocationInView();</code>
<code>47</code>
<code> </code><code>touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);</code>
<code>48</code>
<code>49</code>
<code> </code><code>/* 被控制對象的坐标 */</code>
<code>50</code>
<code> </code><code>CCPoint pos = mControllerListener->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 > 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()->getTouchDispatcher()->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->setiXSpeed(1);</code>
<code>4</code>
<code>mSMoveControll->setiYSpeed(0);</code>
<code>5</code>
<code>6</code>
<code>/* 控制器要添加到場景中才能獲得update事件 */</code>
<code>7</code>
<code>this</code><code>->addChild(mSMoveControll);</code>
<code>8</code>
<code>9</code>
<code>mPlayer->setController(mSMoveControll);</code>
Ok~運作遊戲,成功了~好有意思的遊戲,噗~
本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366381,如需轉載請自行聯系原作者