Jump to content

Touch controls/zh: Difference between revisions

From DDraceNetwork
Darkh (talk | contribs)
No edit summary
Darkh (talk | contribs)
No edit summary
Line 50: Line 50:
JSON文件的根元素必须是一个对象。该对象的属性<code>&quot;touch-buttons&quot;</code>可定义一系列按键的对象。每一个按键对象有以下可调节的性质:
JSON文件的根元素必须是一个对象。该对象的属性<code>&quot;touch-buttons&quot;</code>可定义一系列按键的对象。每一个按键对象有以下可调节的性质:


* 位置和大小 (属性<code>&quot;x&quot;</code>, <code>&quot;y&quot;</code>, <code>&quot;w&quot;</code>, <code>&quot;h&quot;</code>)横/纵坐标和宽/高数据为在单位长度为1000000²的整数。这些''单位表格''会在游戏内依据屏幕大小和纵横比转换为''屏幕表格''数据。这意味着当分辨率改变时一些按键可能会表现得被伸展但这也使我们对于不同的屏幕纵横可提供一个合理的默认值
* 位置和大小属性<code>&quot;x&quot;</code>, <code>&quot;y&quot;</code>, <code>&quot;w&quot;</code>, <code>&quot;h&quot;</code>屏幕显示区域将被平均划分为1000000x1000000,前面提到四个属性为整数,大小分别表示按钮的中心点横纵坐标和宽度高度网格的'''实际单位长度'''会根据游戏窗口大小屏幕比例实时拉伸因此对于不同的屏幕设备,只要屏幕纵横差异不大,按钮布局就不会变得特别不合理
* 形状 (属性<code>&quot;shape&quot;</code>):决定显示出来的形状
* 形状 (属性<code>&quot;shape&quot;</code>):用于决定按形状
** <code>&quot;rect&quot;</code>:
** <code>&quot;rect&quot;</code>:
** <code>&quot;circle&quot;</code>:圆形该按键大小自动调整,从而使宽度和高度一致。
** <code>&quot;circle&quot;</code>:圆形该按钮的高度和宽度会自动调整一致大小
* 可见度 (属性<code>&quot;visibilities&quot;</code>)一系列预置的可见度设置可供选择且仅当所有情况都满足时该按键才会显示。若可见度置空则代表该按键总是显示。置有以设置
* 可见性(属性<code>&quot;visibilities&quot;</code>该属性为空意味着按钮总是显示在屏幕上。如果设置了某些属性按钮将只会在满足特定条件时显示,其它情况下隐藏,目前已设一系列可选的可见度类型如下:
** <code>&quot;ingame&quot;</code>:玩家在游戏,即没有在旁观
** <code>&quot;ingame&quot;</code>:在游戏内显示,即在旁观模式下将会隐藏;
** <code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>, <code>&quot;extra-menu-5&quot;</code>: 给定数字对应的附加菜单处于打开状态。
** <code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>, <code>&quot;extra-menu-5&quot;</code>:在打开对应序号的附加菜单时显示;
** <code>&quot;zoom-allowed&quot;</code>: 该服务器允许缩放
** <code>&quot;zoom-allowed&quot;</code>:当前服务器允许缩放视野时显示;
** <code>&quot;vote-active&quot;</code>: 正在进行投票。
** <code>&quot;vote-active&quot;</code>:当投票进行时显示;
** <code>&quot;dummy-allowed&quot;</code>: 该服务器允许分身
** <code>&quot;dummy-allowed&quot;</code>:当前服务器允许分身连接时显示;
** <code>&quot;dummy-connected&quot;</code>: 分身已经连接
** <code>&quot;dummy-connected&quot;</code>:当分身已经连接时显示;
** <code>&quot;rcon-authed&quot;</code>: 玩家登录了管理员账号。
** <code>&quot;rcon-authed&quot;</code>: 成为管理员时显示;
** <code>&quot;demo-player&quot;</code>: 正位于录像播放器。
** <code>&quot;demo-player&quot;</code>: 播放回放时显示;
** 所有可见都可以在前面添加<code>-</code>来实现反转。例如:<code>&quot;-ingame&quot;</code>玩家未处于游戏中时满足,即旁观中。
** 所有可见性类型都可以通过在添加<code>-</code>前缀来反转。例如:<code>&quot;-ingame&quot;</code>在游戏内隐藏,即旁观模式显示
* 行为 (属性<code>&quot;behavior&quot;</code>):一个定义此按键按下/松开时执行的动作的对象,也包括其标签。属性<code>&quot;type&quot;</code>用于区分使用的行为类。行为种类只能是预设(硬编码的),或者基于通用的控制台令(类似于绑定)。设的行为仅在需要时才使用除此之外所有键为通用绑定
* 行为属性<code>&quot;behavior&quot;</code>:一个用于描述此按钮激活或失效时执行的行为、标签的对象。属性<code>&quot;type&quot;</code>用于区分按钮的行为类。行为类型有两,分别是预设好的硬编码以及基于一般的控制台令(例如:按键绑定)。请根据需求置按钮的行为类型,按钮的预设行为功能较少,其余所有按钮功能来自于一般的绑定
** 预设行为 (属性<code>&quot;type&quot;</code>被设置为<code>&quot;predefined&quot;</code>)性<code>&quot;id&quot;</code>被设置为一个固定的字符串,以此确认使用的预设行为。可用的预设行为:
** 预设行为属性<code>&quot;type&quot;</code>为<code>&quot;predefined&quot;</code>此行为类型的按钮只能执行预设行为。属性<code>&quot;id&quot;</code>为一个字符串,决定特定的预设行为。下方列出可用的预设行为:
*** <code>&quot;ingame-menu&quot;</code>: 松开该按钮时直接打开游戏菜单
*** <code>&quot;ingame-menu&quot;</code>松开该按钮时立即打开游戏菜单
*** <code>&quot;extra-menu&quot;</code>: 附加菜单按钮,切换带有<code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>和<code>&quot;extra-menu-5&quot;</code>可见度的按钮的可见度。住一段时间后松手则会打开游戏菜单
*** <code>&quot;extra-menu&quot;</code>附加菜单切换按钮,在可见性为<code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>和<code>&quot;extra-menu-5&quot;</code>的这些按钮间循环切换,长也可打开游戏菜单
**** 属性<code>&quot;number&quot;</code>定义一个在1至5之间的整数即可对应相应的可见<code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>, <code>&quot;extra-menu-5&quot;</code>。
**** 属性<code>&quot;number&quot;</code>设置为1到5的整数分别对应下面几项的可见<code>&quot;extra-menu&quot;</code>, <code>&quot;extra-menu-2&quot;</code>, <code>&quot;extra-menu-3&quot;</code>, <code>&quot;extra-menu-4&quot;</code>, <code>&quot;extra-menu-5&quot;</code>。
*** <code>&quot;emoticon&quot;</code>: 打开表情选择器(此功能无法通过绑定使用)。
*** <code>&quot;emoticon&quot;</code>打开表情轮盘(此功能无法通过绑定使用);
*** <code>&quot;spectate&quot;</code>: 打开旁观菜单(此功能无法通过绑定使用)。
*** <code>&quot;spectate&quot;</code>打开旁观列表(此功能无法通过绑定使用);
*** <code>&quot;swap-action&quot;</code>:切换当前激活的由直接点击和虚拟摇杆执行的动作(开火和出钩)
*** <code>&quot;swap-action&quot;</code>:切换'''当前'''直接点击屏幕和虚拟摇杆控制的动作(开火和出钩)
*** <code>&quot;use-action&quot;</code>:以当前瞄准角度执行激活的动作
*** <code>&quot;use-action&quot;</code>:以当前瞄准角度执行'''当前''''激活的动作
*** <code>&quot;joystick-action&quot;</code>:使用当前激活动作的虚拟摇杆
*** <code>&quot;joystick-action&quot;</code>:按下时会在调整瞄准角度的同时使用''''当前'''激活动作的虚拟摇杆
*** <code>&quot;joystick-aim&quot;</code>:仅提供瞄准的虚拟摇杆,不会执行其他动作。
*** <code>&quot;joystick-aim&quot;</code>:按下时调整瞄准角度不执行动作的虚拟摇杆
*** <code>&quot;joystick-fire&quot;</code>:总是执行开火的虚拟摇杆
*** <code>&quot;joystick-fire&quot;</code>:按下时在调整瞄准角度的同时开火的虚拟摇杆
*** <code>&quot;joystick-hook&quot;</code>: 总是执行出钩的虚拟摇杆。
*** <code>&quot;joystick-hook&quot;</code>: 按下时在调整瞄准角度的同时出钩的虚拟摇杆。
** 绑定行为(属性<code>&quot;type&quot;</code>设置为<code>&quot;bind&quot;</code>)此行为的按会执行控制台命令,和常规绑定类似
** 绑定行为属性<code>&quot;type&quot;</code>设置为<code>&quot;bind&quot;</code>。此行为类型的按会执行控制台命令,和常规按键绑定类似
*** 属性<code>&quot;label&quot;</code>定义一个字符串作该按的标签
*** 属性<code>&quot;label&quot;</code>字符串,用定义该按的标签(即显示在按钮上的文字);
*** 属性<code>&quot;label-type&quot;</code>一个字符串决定该按键的标签种类,即属性<code>&quot;label&quot;</code>的处理方法:
*** 属性<code>&quot;label-type&quot;</code>定为字符串,用于决定该按键的标签种类,即属性<code>&quot;label&quot;</code>的处理方法:
**** <code>&quot;plain&quot;</code>: 该标签会被直接使用,不会做出任何改变。
**** <code>&quot;plain&quot;</code>标签会被直接呈现;
**** <code>&quot;localized&quot;</code>: 标签会被自动翻译。在有对应翻译时可用
**** <code>&quot;localized&quot;</code>标签会本地化,对默认按钮存在对应翻译时可用
**** <code>&quot;icon&quot;</code>: 图字体被于该。图标必须为UTF-16编码,使用<code>\uXXXX</code>。例如<code>\uf3ce</code>为手机图标,Unicode为<code>f3ce</code>。注意该图标必须在[https://fontawesome.com/search?o=r&m=free Font Awesome Free]可用。
**** <code>&quot;icon&quot;</code>签使标。图标必须为UTF-16编码,格式为<code>\uXXXX</code>。例如<code>\uf3ce</code>为手机图标,对应的Unicode编码为<code>f3ce</code>。注意该图标必须来自于DDNet或在[https://fontawesome.com/search?o=r&m=free Font Awesome Free]可用。
*** 属性<code>&quot;command&quot;</code>一个可以在控制台行的类型字符串,类似于绑定。例如<code>&quot;+fire&quot;</code>为开火动作。
*** 属性<code>&quot;command&quot;</code>定为可以在控制台行的字符串,与绑定类似。例如<code>&quot;+fire&quot;</code>为按钮添加开火动作。
** 绑定切换行为(属性<code>type</code>设置为<code>&quot;bind-toggle&quot;</code>)。此行为的按两个及以上的指之间循环触发
** 绑定切换行为(属性<code>type</code>设置为<code>&quot;bind-toggle&quot;</code>)。此行为类型的按循环触发两个或更多的命令。
*** 属性<code>&quot;commands&quot;</code>定义了两个及以上的指令,依据先后排列顺序依次触发。个指令为一个属性<code>&quot;label&quot;</code>, <code>&quot;label-type&quot;</code>和<code>&quot;command&quot;</code>的对象,与上述绑定行为的定义一致该组中必须至少定义两个指令对象。
*** 属性<code>&quot;commands&quot;</code>两个及以上的指令列表,依据排列的先后顺序依次触发和显示个指令为一个拥有属性<code>&quot;label&quot;</code>, <code>&quot;label-type&quot;</code>和<code>&quot;command&quot;</code>的对象,与上述绑定行为的定义基本一致,但是指令列表中必须至少两个指令对象。


除此之外,根对象还有以下属性:
除此之外,根对象还有以下属性:

Revision as of 10:34, 5 February 2025

触屏操控从DDNet 18.8版本客户端开始启用,这也标志着最近期的首个DDNet安卓版发布。早期的安卓版本为DDNet 9.3.1,该版本已有一个单独教程。以下教程将只考虑18.8以后版本的触屏操控。

在用户界面可以进行的触屏操控如下:

  • 直接点击屏幕某位置:视为移动光标至该位置并用左键单击;
  • 长按屏幕某位置至少0.5秒:视为用鼠标右键单击该位置,轻微移动手指不影响判定;
  • 用两根手指长按屏幕并上下滑动:视为在该位置滚动鼠标滚轮,可以上下滚动列表如服务器浏览器和控制台;
  • 在安卓设备上触发了(虚拟)返回键:视为使用了Esc键,可关闭菜单等。

在游戏内的触屏操控可以通过配置参数cl_touch_controls来开启/关闭,此参数在安卓设备上默认为1,在其他平台则是0。触屏操控在其他支持触控的平台上应该也能正常使用,但此教程主要针对安卓设备进行测试。

游戏内触屏操控包含许多屏幕按钮。不同按钮根据功能不同仅会在可用时显示,例如移动键仅会在进行游玩时显示。

默认触控按键配置

游戏内默认触控键位的截图。

左、右移动和跳跃键的位置分布形如,和键盘上的WASD分布类似。

关于开火和出钩的操作,游戏内默认提供了两种操作方式:

  1. 通过直接点击屏幕,可以将准星直接移动到点击处并立即朝准星处开火或出钩;
  2. 通过拖动虚拟摇杆按钮,可以将准星以玩家位置为原点朝拖动方向移动,同时开火或出钩。

在两种操作方式下都可以点击右上角的“当前”功能按钮切换为开火或出钩模式。当按住虚拟摇杆时,“当前”按钮将变成直接触发另一功能的按钮,按钮上的文字提示也会相应改变。

对于游戏或旁观时,可以分别设置直接点击屏幕的功能,通过禁用“直接触摸操作”可以避免游戏中使用摇杆的同时点击误触。

旁观者模式下,如果将直接触屏操控设置为瞄准,则可以类似图片一样拖动地图进行观察;如果设置为禁用,则只能在摇杆范围内拖动。

默认情况下左上角有两个按钮用于切换上一武器和下一武器。

显示全部默认键位的预览图

左上角的字形按钮是游戏内菜单按钮,可用于显示或隐藏更多按钮,这些按钮大部分与游戏操作无关。包括显示计分板、表情轮盘、旁观列表、全局聊天、队伍内聊天的按钮,以及投票按钮和视野缩放按钮。长按菜单按钮松手时会打开类似于电脑按下 Esc 后的游戏内菜单,当然安卓设备也可以使用返回键代替。

连接分身后,右上角会出现切换分身的按钮。

显示更多按钮时,可以打开表情轮盘或旁观列表等菜单,点击表情发送或点击旁观对象观察,点击空白处则可以关闭菜单,安卓设备可以使用返回键关闭。但是目前还无法实现长按按钮时显示菜单、松手自动关闭的功能,并且也不适合用于旁观列表。

自定义触控键位设置

默认键位保存在touch_controls.json文件中,安卓版本下该文件位于data目录,高版本安卓设备一般会禁止用户修改这一目录下的文件。因此如果您要进行键位自定义,需要通过在配置目录中创建同名为touch_controls.json的文件,利用更高的优先度来覆盖默认设置。

键位配置文件是JSON格式的文本文件,推荐在掌握一定JSON基础的情况下阅读下方教程,在配置JSON文件时必须保证有效性。关于JSON格式的相关教程和工具可在网络上找到,下面也会涉及到许多相关术语,当然也可以将游戏配置文件当作练习对象来学习JSON,但是建议在进行实操前先做好重要文件的备份。本教程涉及的JSON配置文件的结构如下:

JSON文件的根元素必须是一个对象。该对象的属性"touch-buttons"可定义一系列按键的对象。每一个按键对象有以下可调节的性质:

  • 位置和大小(属性"x", "y", "w", "h"):屏幕显示区域将被平均划分为1000000x1000000的网格,前面提到的四个属性为整数,大小分别表示按钮的中心点横纵坐标和宽度高度。网格的实际单位长度会根据游戏窗口大小及屏幕比例实时拉伸,因此对于不同的屏幕设备,只要屏幕纵横比差异不大,按钮布局就不会变得特别不合理。
  • 形状 (属性"shape"):用于决定按钮形状:
    • "rect":矩形;
    • "circle":圆形,该按钮的高度和宽度会自动调整为一致大小。
  • 可见性(属性"visibilities"):该属性为空意味着按钮总是显示在屏幕上。如果设置了某些属性,按钮将只会在满足特定条件时显示,其它情况下隐藏,目前已预设一系列可选的可见度类型如下:
    • "ingame":仅在游戏内显示,即在旁观模式下将会隐藏;
    • "extra-menu", "extra-menu-2", "extra-menu-3", "extra-menu-4", "extra-menu-5":在打开对应序号的附加菜单时显示;
    • "zoom-allowed":当前服务器允许缩放视野时显示;
    • "vote-active":当投票进行时显示;
    • "dummy-allowed":当前服务器允许分身连接时显示;
    • "dummy-connected":当分身已经连接时显示;
    • "rcon-authed": 成为管理员时显示;
    • "demo-player": 当播放回放时显示;
    • 所有可见性类型都可以通过在添加-前缀来反转。例如:"-ingame"将在游戏内隐藏,即旁观模式中显示。
  • 行为(属性"behavior"):一个用于描述此按钮激活或失效时执行的行为、标签的对象。属性"type"用于区分按钮的行为类型。行为类型有两种,分别是预设好的硬编码以及基于一般的控制台命令(例如:按键绑定)。请根据需求设置按钮的行为类型,按钮的预设行为功能较少,其余所有按钮功能来自于一般的绑定:
    • 预设行为(属性"type""predefined"):此行为类型的按钮只能执行预设行为。属性"id"为一个字符串,用以决定特定的预设行为。下方列出可用的预设行为:
      • "ingame-menu":松开该按钮时立即打开游戏内菜单;
      • "extra-menu":附加菜单切换按钮,在可见性为"extra-menu", "extra-menu-2", "extra-menu-3", "extra-menu-4""extra-menu-5"的这些按钮间循环切换,长按也可打开游戏菜单;
        • 将属性"number"设置为1到5的整数分别对应下面几项的可见性"extra-menu", "extra-menu-2", "extra-menu-3", "extra-menu-4", "extra-menu-5"
      • "emoticon":打开表情轮盘(此功能无法通过绑定使用);
      • "spectate":打开旁观列表(此功能无法通过绑定使用);
      • "swap-action":切换当前直接点击屏幕和虚拟摇杆控制的动作(开火和出钩);
      • "use-action":以当前瞄准角度执行当前'激活的动作;
      • "joystick-action":按下时会在调整瞄准角度的同时使用'当前激活动作的虚拟摇杆;
      • "joystick-aim":按下时仅调整瞄准角度不执行动作的虚拟摇杆;
      • "joystick-fire":按下时会在调整瞄准角度的同时开火的虚拟摇杆;
      • "joystick-hook": 按下时会在调整瞄准角度的同时出钩的虚拟摇杆。
    • 绑定行为(属性"type"设置为"bind")。此行为类型的按钮会执行控制台命令,和常规按键绑定类似:
      • 属性"label"指定为字符串,用作定义该按钮的标签(即显示在按钮上的文字);
      • 属性"label-type"指定为字符串,用于决定该按键的标签种类,即属性"label"的处理方法:
        • "plain":标签会被直接呈现;
        • "localized":标签会本地化,仅对默认按钮存在对应翻译时可用;
        • "icon":标签使用图标。图标必须为UTF-16编码,格式为\uXXXX。例如\uf3ce为手机图标,对应的Unicode编码为f3ce。注意该图标必须来自于DDNet或在Font Awesome Free上可用。
      • 属性"command"指定为可以在控制台执行的命令的字符串,与绑定类似。例如"+fire"为按钮添加开火动作。
    • 绑定切换行为(属性type设置为"bind-toggle")。此行为类型的按钮会循环触发两个或更多的命令。
      • 属性"commands"指定为两个及以上的指令列表,依据排列的先后顺序依次触发和显示。单个指令为一个拥有属性"label", "label-type""command"的对象,与上述绑定行为的定义基本一致,但是在指令列表中必须至少有两个指令对象。

除此之外,根对象还有以下属性:

  • "direct-touch-ingame": 定义在游戏中直接点击所执行的动作。可用的值有:
    • "disabled":游戏中直接点击不会执行任何动作。这意味着需要使用虚拟摇杆。
    • "action":直接点击会使用当前被激活的动作(见上)。
    • "aim":直接点击仅会改变瞄准角度,不会执行其他动作。这意味着你需要其他按钮来开火或出钩。
    • "fire":直接点击总是会开火。
    • "hook":直接点击总是会出钩。
  • "direct-touch-spectate":定义在旁观时直接点击所执行的动作。可用的值有:
    • "disabled":旁观时直接点击不会执行任何动作。这意味着需要使用虚拟摇杆。
    • "aim":直接点击可用于旁观。

游戏内菜单栏

触控模式下显示游戏内菜单栏时的游戏截图。

除了菜单栏底下的触控按钮,将cl_touch_controls设置为 1 (推荐值)后,在菜单栏下方第二行还会出现一些不常用但重要又需要键盘才能使用的功能:

  • 打开本地和远程控制台的按钮:当绑定控制台开关的触控按键失效时,仍可以快捷查看显示在控制台的错误信息;
  • 菜单关闭按钮:在不方便使用返回键时更便于关闭菜单。
  • 键位编辑器开关(详情见下方)。

键位编辑器

游戏内键位编辑器的截图。

键位编辑器在被启用时会显示在游戏内菜单的主屏幕上。该编辑器目前只有最基本的键位编辑功能。

  • 保存当前设置至配置目录中的touch_controls.json文件。
  • 取消当前设置,并加载配置目录中的touch_controls.json文件。
  • 加载数据目录中的touch_controls.json文件从而将键位初始化。
  • 用于提醒当前设置未被保存。
  • 从剪贴板导入设置,或将设置导出至剪贴板。在较新的安卓版本中这是修改键位的唯一方法,因为无法直接修改应用的数据。

同时,全局的触摸控制也可以在该界面被修改:

  • 游戏中和旁观时的直接点击输入(见键位设置格式)可以用下拉菜单调整。

当键位编辑器被打开时,所有按键都会无条件显示,从而让玩家更好地排列按键。

键位调整

  1. 导出当前键位至剪贴板。
  2. 将剪贴板内容粘贴至一个文件来修改它。同时你也应该给你的键位设置备份!
  3. 修改键位设置(关于相关格式见上)。
  4. 复制所有内容至剪贴板,然后在客户端内导入。若导入失败,在本地控制台内找到包含touch_controls的错误消息,并更正错误。用在线工具可更正JSON文本的错误和格式化。
  5. 更改完成后在客户端中保存你的设置。你也可撤销更改或者初始化键位如果你搞砸了。

一个可在客户端内直接修改键位的界面在计划中。

注:你也可直接更改配置目录中的touch_controls.json文件来修改键位,而不是导出/导入到剪贴板,但在安卓该做法不可行。

示例

全局键位格式设置的示例:

{
    "direct-touch-ingame": "action",
    "direct-touch-spectate": "aim",
    "touch-buttons": [
        ...
    ]
}

示例按钮,带有"bind"的行为,会在对话框返回一条消息:

{
    "x": 500000,
    "y": 500000,
    "w": 100000,
    "h": 100000,
    "shape": "rect",
    "visibilities": [
    ],
    "behavior": {
        "type": "bind",
        "label": "Example",
        "label-type": "plain",
        "command": "echo Hello world!"
    }
}

示例按钮,带有"predefined"的行为,是一个会执行当前被激活的行为的虚拟摇杆:

{
    "x": 755000,
    "y": 580000,
    "w": 225000,
    "h": 400000,
    "shape": "circle",
    "visibilities": [
        "ingame"
    ],
    "behavior": {
        "type": "predefined",
        "id": "joystick-action"
    }
}

示例按钮,带有"bind-toggle"的行为,会在对话框循环返回三条不同的消息:

{
    "x": 600000,
    "y": 200000,
    "w": 100000,
    "h": 100000,
    "shape": "rect",
    "visibilities": [
    ],
    "behavior": {
        "type": "bind-toggle",
        "commands": [
            {
                "label": "Echo 1",
                "label-type": "plain",
                "command": "echo 1"
            },
            {
                "label": "Echo 2",
                "label-type": "plain",
                "command": "echo 2"
            },
            {
                "label": "Echo 3",
                "label-type": "plain",
                "command": "echo 3"
            }
        ]
    }
}

一些已知的问题

  • 安卓的问题:同时按下三根手指会导致所有手指被立即同时松开。
    • 解决方法:原因是你手机自带的全局多指手势动作(设置里面搜"三指")。具体地,关闭"三指下滑截屏","三指长按截屏","三指上滑进入菜单"功能。
  • 安卓的问题:有时候点击屏幕顶端15%位置会无响应或响应不连续。
    • 解决方法:目前不清楚原因。一般可以重启应用,返回手机主界面也可能可以修复该问题。

实现细则

以下为实现触摸控制的细节,为开发者准备。

游戏内触摸控制在单独的客户端组件CTouchControls中实现,该组件位于src/game/client/components/touch_controls.cppsrc/game/client/components/touch_concontrol.h文件中。尽量直接使用绑定作为按钮的行为而不是预定义行为,从而降低复杂度。

在分叉客户端中加入你自己的按键行为时,建议在新形状,可见性,行为等前加上你的分叉的名称。例如:myfork.octagon 如果你添加一个八边形的按键,从而避免和未来的版本发生冲突。

为其他的客户端组件例如表情轮盘和旁观菜单添加触摸控制支持时,使用CUi::UpdateTouchState函数。确保你的组件会在接收KEY_ESCAPE时自动关闭,即安卓上的返回键。注意在每一帧中,只有一个组件可以使用触摸状态,因此按住一个游戏按键时同时用另一个手指使用另一个组件例如表情轮盘是不可能的。相反,相应的预定义按钮触摸行为(例如CSpectateTouchButtonBehavior)仅会触发游戏内的组件(例如旁观菜单),但是不会将其再次停用。激活OnActivate函数中的组件已经会导致激活按钮的手指同时会影响激活的组件。

参考资料