SneakyInput 是一個 OpenSource 的 Cocos2D 專案,它能做些什麼事呢?他可以讓你很方便的在畫面上輕鬆的產生虛擬類比控制器和按鈕 ! 如下圖:

ChaosRing    

(上圖為 Square Enix 的遊戲 : Chaos Rings 的遊戲畫面)

對於一個已經訓練有素的遊戲程式設計師來說自己寫一套不難,但對於剛入門的新手來說這免費的套件是天下掉下來的禮物阿!除了會用以外最好也順便瞭解一下運作原理,當有特殊需求時才方便客製,以下是 SneakyInput 這個套件的架構跟功能介紹。

SneakyInput 的撰寫架構:

這套件主要是由四個 Class 組成~

  • - SneakyJoystick (遵從 CCTargetedTouchDelegate)
  • - SneakyJoystickSkinnedBase (繼承 CCSprite)
  • - SneakyButton (遵從 CCTargetedTouchDelegate)
  • - SneakyButtonSkinnedBase (繼承 CCSprite)

螢幕快照 2013-03-04 下午4.13.27  

(架構示意圖)

操縱按鈕和搖桿的 Touch 事件和搖桿位置的運算全部寫在 SneakyJoystick 和 SneakyButton,外觀的產生和圖層的移動則定義在 SneakyButtonSkinnedBase 和 SneakyJoystickSkinnedBase檔案中,不知這樣算不算有依循 smalltalk 的 MVC 架構呢 ? Anyway,先來看看處理外觀的部分:

螢幕快照 2013-03-04 下午5.04.23

因為繼承 CCSprite 的關係,使用者可以輕易的設定這兩個類別物件的位置,大小,縮放比。

SneakyButtonSkinnedBase 的部分比較單純,因為按鈕通常不會移動位置所以沒有成員函式。只要將幾個按鈕不同狀態需要顯示的 Sprite 設定給它即可,其中的成員變數 button 即為 SneakyButton 類別,讓玩家透過和 SneakyButton 類別做互動 (Touch Event) 的時候 SneakyButtonSkinnedBase 可以正確的修改需要顯示的狀態。

SneakyJoystickSkinnedBase 的部分,因為大拇哥的圖示 (thumbSprite) 需要根據玩家操作搖桿 (SneakyJoystick) 的位置來修改的位置,在此選擇用一個 updatePosition() 的函式做 thumbSprite 和 SneakyJoystick 的持續位置同步:

螢幕快照 2013-03-04 下午5.35.07  

螢幕快照 2013-03-04 下午5.35.30

 接下來讓我們來看看 SneakyJoystick 和 SneakyButton 的架構及重要屬性:

螢幕快照 2013-03-04 下午5.42.51  
- SneakyJoystick 常用的屬性:

  • - isDPad : 是不是 DPad,DPad 是像以前任天堂的手把的十字控制鈕,玩家基本上只能控制上下左右。
  • - hasDeadZone : 有沒有死角,死角是從搖桿的圓心出發開始計算,預設為 NO,假如 isDPad = YES 則此項會自動設成 YES 且 deadRadius = 10.0f
  • - disabled : 此功能是否有作用,這是 Alan 自己加入的屬性,用在像 Chaos Rings 虛擬手把在玩家觸碰銀幕時才會出現的情況,後續會有使用範例及說明。

- SneakyButton 常用的屬性:

  • - status : 是否為啓用的狀態,預設為 1 (YES),假如設為零的話按鈕就會以 SneakyButtonSkinnedBase 中設定的 disabledSprite 作為按鈕圖示。
  • - active : 是否為點選狀態,預設為 NO,假如設為 YES 或者玩家點擊按鈕時則會呈現 activedSprite 這張圖示,這也會是最常拿來判斷按鈕是否有被玩家按下的屬性。
  • - isHoldable : 是否能夠按住此按鈕,預設為 0 (NO),按住則不會有連續的效用,假如玩家可以連續射擊的話那 isHoldable 就要設成 1 (YES)。
  • - isToggleable : 是否能夠開關,預設為 0,假如設為 1 的話那玩家點擊一次按鈕則按鈕會顯示 activedSprite 的圖示,在點擊一次才會切換成預設的 defaultSprite 圖示。

這兩個 Class 均遵從 CCTargetedTouchDelegate,也就是說會可以對玩家的 Touch 事件做相對應的處理。(ccTouchBegan, ccTouchMoved, ccTouchEnded)

註:為什麼有的屬性用 0 跟 1 有的屬性用 YES 跟 NO 來存取呢 ? Alan 也不清楚,這跟撰寫遊戲的習慣有關係,不過因為是 BOOL 屬性,不管用 0/1 或 YES/NO 判斷上都不會有問題才是。

下一篇,會針對 SneakyInput 的實作做個介紹。

---------參考資料----------

Sneaky Input 原始碼

----------------------------

Thinking.jpg  

筆者:Alan Feng

大學由資管系畢業後便投入職場,先後擔任程式設計師,系統設計師,系統分析師,專案管理師等職務。

曾服務於資訊服務業,電子代工設計公司,目前在內湖一間遊戲公司擔任專案管理師~

持有國際 PMP 證照並努力學習 Scrum 敏捷式開發框架中。


arrow
arrow

    Alan Feng 發表在 痞客邦 留言(0) 人氣()