手游摇杆设计:基于Flashui与Detour | 您所在的位置:网站首页 › 摇杆设计 › 手游摇杆设计:基于Flashui与Detour |
作者:庄钟杰(程序) 0. 摘要 本文总结了我们游戏虚拟摇杆实现过程中遇到的问题, 着重介绍flashui多点触摸与detour寻路算法, 包括: 如何在flashui上设计一套稳定的多触点摇杆按钮响应系统, 在手残党疯狂高速点击之下仍能正常工作? 如何用detour模块, 设计适合摇杆方向控制的寻路方案? 1. 虚拟摇杆需求与术语我们要实现的摇杆系统如Fig.1所示: 左侧为方向控制器joystick. 右侧为按钮面板joypanel, 里面包含了若干功能按钮joybutton. 功能按钮的形状有圆形和1/4环形. Fig.1 摇杆术语 2. 多点触摸方案手游摇杆系统首要解决的是多点触摸问题, 摆在我们面前的有两套方案: 引擎内置Python层. 通过注册game.on_touches_began, game.on_touches_moved, game.on_touches_ended回调函数, 处理屏幕上出现的触摸事件. (具体用法请参考Reference3) Flashui内置AS层. 使用addEventListerner为元件增加TouchEvent处理函数, 可侦听该元件上的TOUCH_BEGIN, TOUCH_MOVE, TOUCH_END事件. (具体用法请参考Reference2) 很多项目组都采用了第1种方案, 然而我们是二次开发, 为了与既有代码兼容, 我们最终选择了第2种方案, 在flashui层检测多触点事件. 3. 方向控制Joystick实现与性能优化3.1 Joytick实现 先讨论在Flashui层如何实现joystick的触摸检测, 代码如下. m_joystick是Fig.1左侧joystick元件, m_touch_id用来记录TOUCH_BEGIN时的触点ID. 这里有一个小技巧: 摇杆TOUCH_BEGIN后, 把TOUCH_MOVE和TOUCH_END侦听器注册到stage上, 这样可以做到手在整个屏幕上移动, 无需保持在摇杆的区域内. 巨坑来袭... 第2触点问题 上面的Joystick实现逻辑上看不出什么问题, 在PC/iOS上也验证过没有问题. 然而到安卓机器上, 诡异的事情发生了: 当一个手指A持续移动摇杆, 另一个手指B在屏幕另一个位置上按下并抬起后, 游戏帧率直接由30帧降到10帧! 更诡异的事情是, 移动摇杆的手指A抬起后, 游戏又恢复回30帧. 总之: 移动摇杆过程中, 一旦出现第2触点的按下/抬起, 帧率立刻骤减; 而全部触点抬起后, 又恢复正常. 咨询了李大师/牛奶等大大们, 他们都木有遇到过, 只能自力更生. 于是祭出NeoX引擎内置的Profiling. NeoX Profiling的好处是, 可以在release版的引擎中, 通过脚本打印出各个模块消耗的时间, 具体使用可参考Reference1. 在脚本里写了一个函数log_performance, 每秒钟打印一次性能数据. 查看数据后, 发现帧率骤减时, InputUpdate消耗的时间竟达到了60ms, 而正常情况下改值 |
CopyRight 2018-2019 实验室设备网 版权所有 |