手游摇杆设计:基于Flashui与Detour 您所在的位置:网站首页 摇杆设计 手游摇杆设计:基于Flashui与Detour

手游摇杆设计:基于Flashui与Detour

#手游摇杆设计:基于Flashui与Detour| 来源: 网络整理| 查看: 265

作者:庄钟杰(程序)

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 实验室设备网 版权所有