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 敏捷式开发框架中。


相关文章