65.9K
CodeProject 正在变化。 阅读更多。
Home

轩辕传说案例研究:通过二合一状态、触摸和加速计实现最佳游戏体验

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年9月2日

CPOL

19分钟阅读

viewsIcon

15515

本案例研究介绍了腾讯与英特尔工程师合作,对《轩辕传说》进行了优化,加入了触摸功能并更新了用户界面,从而在运行 Windows* 8 的二合一系统和 Ultrabook 上提供了高质量的游戏体验。

摘要

腾讯希望为玩家在英特尔® Ultrabook™ 和二合一系统上提供最佳体验。《轩辕传说》已是一款成功的游戏,但这些系统为腾讯提供了新的机会。目前许多系统都支持二合一使用模式,这意味着它们既可以作为传统笔记本电脑使用,也可以作为平板电脑使用。腾讯与英特尔工程师合作,检测笔记本电脑和平板电脑模式,以改变游戏的状态。他们更新了用户界面以支持触摸,这已成为平板电脑上最重要和最令人兴奋的功能之一。最后,系统的传感器通过加入“摇晃”功能来实现新的游戏玩法,以激活游戏中的特殊动作。

为中国市场推出首款触摸式 3D MMORPG

腾讯是中国最大的游戏开发商。随着中国市场二合一系统数量的不断增长,腾讯希望为玩家提供独特的体验。《轩辕传说》上市两年后,已成为一款热门游戏。Ultrabook 和二合一系统的出现,使其成为添加触摸和加速计支持的绝佳时机。尽管 3D MMORPG 在中国非常受欢迎,但在《轩辕传说》之前,没有一款支持触摸。腾讯有机会进行创新,但也有风险——这些改变会成功吗?本案例研究将说明腾讯如何与英特尔工程师合作,对游戏进行修改,使其在运行 Windows* 8 的二合一系统和 Ultrabook 上运行良好。

《轩辕传说》需要为平板电脑和笔记本电脑模式提供两种不同的用户界面。在二合一系统上,游戏可以检测系统是作为笔记本电脑还是平板电脑使用。在笔记本电脑模式下,游戏使用键盘和鼠标。当作为平板电脑使用时,游戏会切换到仅触摸界面。腾讯希望在传统笔记本电脑模式和触摸游戏之间实现无缝过渡。由于用户界面会根据每种模式自动更改,因此玩家体验是无缝的。在本案例研究中,我们将探讨如何检测二合一系统的模式并根据该模式更改用户界面。

将现有用户界面转换为触摸操作可能很困难。对于依赖左键单击、右键单击和多个命令键的复杂用户界面的游戏来说,尤其如此。没有一个通用的公式可以适应这种用户界面。需要非常小心才能通过触摸提供流畅且令人满意的游戏体验。由于游戏已有用户基础,团队在进行更改时非常谨慎,尽量缩小改动范围,以免疏远现有玩家。我们将回顾用户界面的设计。

由于这些系统包含加速计,腾讯还增加了对“超级击杀”攻击的支持,当玩家在游戏过程中摇晃系统时,可以对敌人发动攻击。

更改游戏模式以匹配二合一状态

《轩辕传说》具有两种用户界面风格,并根据二合一系统的状态动态更改用户界面。当系统处于笔记本电脑模式时,《轩辕传说》将像往常一样通过键盘和鼠标输入进行游戏。当系统处于平板电脑模式时,玩家将使用触摸输入。这如何实现?

实现方法:检测二合一状态变化并更改用户界面模式

《轩辕传说》会监听 `WM_SETTINGCHANGE` 消息。当系统状态发生变化时,此消息会通知应用程序。当二合一状态发生变化时,`WM_SETTINGCHANGE` 消息会带有一个 `LPARAM`,该参数指向一个值为“`ConvertibleSlateMode`”的字符串。调用 `GetSystemMetrics(SM_CONVERTIBLESLATEMODE)` 可以获取当前状态。

当游戏处于平板电脑模式时,它会显示一个带有触摸按钮的覆盖用户界面,用于各种用户界面操作。在笔记本电脑模式下,它会隐藏覆盖用户界面。

《轩辕传说》使用类似这样的检测代码

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  case WM_SETTINGCHANGE:
    if (lParam != NULL && wcscmp(TEXT("ConvertibleSlateMode"), (TCHAR *)lParam) == 0)
    {
      BOOL bSlateMode = (GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0);
      if (bSlateMode == True) //Slate mode, display the Touch overlay UI
        …
      else //Laptop mode, hide the touch overlay UI
        …
    }
图 1:检测系统设置更改并检查系统模式的代码

有关更多详细信息,请查看基础的 2 in 1 aware sample

此技术必须由系统 OEM 启用,并安装支持驱动程序才能工作。如果某些系统未正确启用,我们提供了一种手动更改用户界面配置的方法。后续部分将介绍用户界面的工作原理。

现在轮到你了:检测系统是作为笔记本电脑还是平板电脑使用

如何为你的游戏检测系统状态,以及它应该如何更改用户界面?为了在二合一系统上获得最佳游戏体验,你的游戏应该具有双重模式,并根据系统状态动态更改用户界面。

首先,为笔记本电脑和کتابچه (tablet) 模式规划用户界面。考虑系统可能被如何握持或放置。选择最适合玩家的用户界面交互。在设计触摸界面时,你应该为触摸控件预留比鼠标按钮更多的屏幕区域。否则,玩家将难以可靠地按下触摸控件。

触摸交互通常比键盘和鼠标慢,因此也要牢记这一点。游戏菜单也需要键盘+鼠标用户界面和触摸用户界面。

最好在启动时使用 `GetSystemMetrics` 检查系统状态并相应地设置用户界面。请记住,并非所有系统都能正确报告其状态或通知你的游戏状态更改,因此请选择一个默认的启动状态,以防状态未被检测到。

游戏运行时,监听 `WM_SETTINGCHANGE` 消息。当消息到达时,检查其内容,查看 `LPARAM` 是否指向一个值为“`ConvertibleSlateMode`”的字符串。该值表示游戏应调用 `GetSystemMetrics(SM_CONVERTIBLESLATEMODE)` 并检查用户界面是否应更改。

检测可能不确定,因为并非所有系统都能正确报告状态更改。如果检测结果不确定,你的游戏应该默认使用笔记本电脑模式。它绝对应该包括一种手动在键盘/鼠标模式和کتابچه (tablet) 模式之间切换用户界面的方法。

要获取完整的检测系统状态并更改用户界面的示例,请查看 2 in 1 aware sample。要查看更复杂的示例,该示例可以检测对接、屏幕方向等,请查看 detecting state sample

决定触摸消息类型

在为现有应用程序添加触摸支持之前,你需要决定支持哪种窗口消息类型。选择以下三种窗口消息集中的一种:`WM_POINTER`、`WM_GESTURE` 或 `WM_TOUCH`。我们将逐步介绍《轩辕传说》所使用的决策过程,并探讨你如何为你的游戏执行相同的操作。

我们是如何做到的:比较触摸消息类型

触摸支持是《轩辕传说》新版本的核心。当玩家使用触摸屏时,他们会看到一个带有屏幕上触摸控件的新用户界面。

`WM_POINTER` 是最容易编码的消息类型,并且支持丰富的触摸手势。`WM_POINTER` 仅在 Windows 8 及更高版本上运行。腾讯希望支持大量 Windows 7 玩家,因此 `WM_POINTER` 不是正确的选择。

在讨论剩余的消息类型之前,让我们回顾一下《轩辕传说》的关键用户界面元素。游戏的触摸用户界面使用屏幕上的按钮控件。这些控件可同时用于移动和动作。移动和动作控件位于屏幕的相对两侧,供双手使用。这些控件位于屏幕的底部角落。屏幕顶部附近还有一个图标,用于调出级联菜单以显示更复杂的用户界面元素。我们稍后将讨论用户界面的设计,但这可以让我们对用户界面的工作原理有一个很好的了解。

图 2:屏幕上的触摸覆盖用户界面,位于左下角和右下角

游戏必须能够识别来自屏幕不同部分的同步接触点。由于多个触摸点必须同时工作,因此我们称之为多点触控。

现在我们了解了多点触控用户界面的主要部分,我们可以比较剩余的消息类型:`WM_GESTURE` 和 `WM_TOUCH`。最容易编码的是 `WM_GESTURE`,它对常见的触摸手势(如双指捏合(缩放)和手指滑动(平移))提供了简单的支持。此消息类型隐藏了触摸交互的一些细节,并在手势完成后将完整的手势呈现给你的代码。简单的触摸事件仍会作为鼠标消息发送到你的游戏。这意味着可以使用鼠标消息实现典型的触摸界面,用于简单的触摸事件,并使用 `WM_GESTURE` 处理复杂的手势。

`WM_GESTURE` 支持的手势只能包含一组相关的触摸点。这使得支持这种多点触控 UI 中的手势变得困难,因为玩家会在不同位置触摸屏幕。对于这款游戏来说,`WM_GESTURE` 是一个不好的选择。

`WM_TOUCH` 是最低级别的触摸消息类型。它提供了对所有触摸事件(例如,“手指按下”)的完全访问权限。`WM_TOUCH` 需要你比其他消息类型做更多的工作,因为你必须编写代码来表示所有高级触摸事件和手势,这些都源自低级触摸消息。尽管需要额外的工作,但 `WM_TOUCH` 仍然是《轩辕传说》的明确选择。`WM_TOUCH` 提供了对包括多点触控在内的所有触摸交互的完全控制。

当屏幕上有物理触摸时,系统会将 `WM_TOUCH` 消息发送到游戏。游戏同时还会收到鼠标单击消息。这使得没有完全触摸支持的应用程序也能在触摸时正常运行。由于这两种不同类型的消息描述了同一个物理事件,这可能会使消息处理代码变得复杂。《轩辕传说》在可能的情况下使用鼠标单击消息,并丢弃重复的消息。

轮到你了:为你的游戏选择正确的触摸消息类型

如果你的游戏只在 Windows 8 上使用,`WM_POINTER` 是一个很好的选择。如果你需要向后兼容,请同时查看 `WM_GESTURE` 和 `WM_TOUCH` 消息。

在比较消息类型时,请考虑你的用户界面设计。如果你的用户界面严重依赖手势,并且你可以轻松地为非手势的单点触摸事件编写鼠标单击处理程序,那么 `WM_GESTURE` 可能适合你的游戏。否则,请使用 `WM_TOUCH`。大多数具有全功能用户界面的游戏都使用 `WM_TOUCH`,特别是当它们有多个玩家会同时触摸的控件时。

在评估触摸消息时,不要忘记菜单系统。同样,请记住丢弃作为鼠标单击到达的额外消息。

要了解有关这三种消息类型之间权衡的更多信息,请参阅 这篇文章。要了解更多关于在兼容旧版本的 `WM_TOUCH` 和 `WM_GESTURE` 消息类型之间进行选择的详细信息,请参阅 https://software.intel.com/en-us/articles/touch-samples

调整用户界面以使用触摸

将现有游戏用户界面适配到触摸操作可能很复杂,并且没有一个通用的公式可以做得很好。

我们是如何做到的:新的触摸用户界面

键盘和鼠标用户界面很熟悉。它使用 W、A、S、D 键移动角色。屏幕底部可自定义的动作键和快捷键 1-9 用于存放药水、攻击技能,并打开更丰富用户界面元素,如物品栏、技能树、任务和地图。右键单击用于选择角色的武器和盔甲,或打开宝箱。

触摸屏始终可用,但在键盘和鼠标游戏过程中,触摸用户界面默认是隐藏的。在此模式下,屏幕上会显示一个触摸按钮。

图 3:在此模式下按下此触摸按钮会调出触摸用户界面

如果玩家将系统切换到کتابچه (tablet) 模式或触摸此按钮,则完整的触摸用户界面将出现在屏幕上。

我们是如何做到的:触摸用户界面的元素

在کتابچه (tablet) 模式下,玩家通常会双手握持设备。用户界面布局利用了双拇指,以最大程度地减少握持变化。移动和攻击动作被分组,以便玩家的左手和右手拇指轻松访问。

首先,我们设计了一个轮盘控件来移动角色。该轮盘位于屏幕左侧的覆盖层上。这类似于游戏控制器,这种熟悉的用法和位置使其易于使用。玩家的左拇指通常会持续接触屏幕。当他们滑动拇指时,角色会根据玩家拇指的方向在屏幕上移动。

常规的游戏内动作栏位于屏幕底部,但这并不适合拇指操作。我们在右下角添加了一组 4 个大型动作按钮,玩家的右拇指可以轻松够到。玩家可以通过将攻击技能或药水拖动到每个按钮来配置这些按钮,以触发他们最常用的动作。

玩家在攻击之前必须先锁定敌人。使用键盘/鼠标界面,左键单击锁定单个敌人,TAB 键锁定攻击范围内的下一个敌人。在触摸模式下,有一个大按钮可以锁定最近的敌人。玩家也可以直接触摸敌人进行锁定,但这并不常见,因为它会打断玩家握持کتابچه (tablet) 的姿势。

键盘和鼠标用户界面使用右键单击来打开宝箱、装备武器或盔甲,或饮用药水。点击并按住是右键单击的最佳触摸替代方案,因此它取代了触摸用户界面中的右键单击。

使用键盘/鼠标用户界面,屏幕上有一个小图标用于打开级联窗口。这对于触摸操作效果不佳,因为图标太小。触摸用户界面包括一个屏幕上的图标,通过级联图标集调出用户界面的其余部分。这些图标会打开用户界面中更复杂的部分,如物品栏、技能树、任务等。还有一个选项可以在键盘/鼠标用户界面和触摸覆盖层之间切换用户界面。这为玩家提供了一种方便的方式来在两种用户界面之间切换。

图 4:完整的触摸用户界面,包括移动轮盘、动作和目标按钮,以及显示的级联用户界面

这是带有级联图标打开的完整触摸用户界面。

我们是如何做到的:触摸用户界面的消息处理

消息处理是如何工作的?它因用户界面的不同部分而异。同时使用了 `WM_TOUCH` 和鼠标消息。动作、目标和级联用户界面按钮都使用鼠标单击消息。移动轮盘和游戏主屏幕部分使用 `WM_TOUCH` 消息。

典型的游戏玩法涉及持续触摸移动轮盘控件,并反复使用敌人选择和技能攻击按钮。这意味着良好的多点触控支持至关重要。幸运的是,`WM_TOUCH` 对多点触控有良好的支持。

当收到 `WM_TOUCH` 消息时,游戏会保存一些上下文。它会将此触摸与最近的其他 `WM_TOUCH` 消息进行比较,检查当前触摸序列已保持多长时间,并查找触摸的位置。

如果 `WM_TOUCH` 消息位于移动轮盘上或附近,代码会检查触摸位置相对于轮盘中心和先前触摸的位置。如果触摸点靠近先前的触摸点,并且当前的触摸手势是从轮盘开始的,则游戏会向期望的方向移动角色。在开发过程中,这需要一些仔细的配置来区分在移动轮盘上的长时连续触摸和其他在屏幕主部分的触摸。

如果屏幕上的 `WM_TOUCH` 消息位于其他控件之外,则它可能是缩放或平移等手势的一部分,或者可能是点击并按住的一部分。`WM_TOUCH` 消息会与先前消息进行比较,以决定采取何种操作。如果它足够接近第一个触摸点并且已按住超过 0.2 秒,则将其视为点击并按住。否则,它被视为手势,屏幕会相应调整。

系统还会自动为所有触摸消息生成鼠标消息。每条鼠标消息都包含额外的附加信息,详细说明其来源。`GetMessageExtraInfo` 调用会识别差异。

#define MOUSEEVENTF_FROMTOUCH 0xFF515700

if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) { 
  // Click was generated by wisptis / Windows Touch
}else{ 
  // Click was generated by the mouse.
}
图 5:检查鼠标消息是否来自触摸屏

当鼠标消息来自触摸屏,并且游戏已通过 WM_TOUCH 处理了物理触摸时,游戏会丢弃该鼠标消息。

如果触摸消息位于其他控件之一上,则会将其丢弃,而使用鼠标消息。

所有用户界面元素都已就位,游戏在触摸屏上的运行效果很好。

本文介绍了在《战争游戏:欧洲扩张》中将复杂用户界面适配到触摸操作的另一个示例:https://software.intel.com/en-us/articles/wargame-european-escalation-performance-and-touch-case-study

轮到你了:构建你的触摸用户界面

在为你的游戏构建触摸用户界面之前,想象一下玩家可能采取的所有操作。然后思考它们如何通过触摸(或其他传感器,如加速计)来实现。特别注意点击和单击之间的区别、按住等连续操作以及拖动等手势。

决定玩家将如何通过触摸执行所有这些操作,以及可见控件应放置在哪里。对于任何屏幕控件或级联菜单,请确保它们足够大,以便用指尖或拇指使用。考虑你的典型玩家将如何握持设备,并设计你的用户界面,以便在典型握持姿势下易于触摸操作。

现在你已经规划好了用户界面,请使用最简单的消息来完成工作。识别触摸何时击中了每个控件。规划要为这些控件使用哪种消息类型(鼠标或触摸),并丢弃重复的消息。

对于触摸消息,请保存触摸消息的上下文。位置、控件和时间在需要根据多个触摸消息组合手势时都将非常有用。思考你的游戏玩法中需要连续触摸接触的部分。在开发过程中仔细测试这一点,以确保你的游戏能够很好地处理手势的典型变化。检查各种手势方向、触摸位置、与先前触摸的接近程度以及触摸持续时间。

从与系统当前状态匹配的任何模式开始启动用户界面。当系统状态更改时,在触摸和键盘/鼠标之间切换用户界面。最后,请记住包含一种手动强制更改用户界面的方法,以防系统未正确配置为通知你。

有关设计触摸用户界面的更多技巧,请参阅 Ultrabook and tablet Windows touch developer guide

传感器

Ultrabook 和二合一系统包含陀螺仪、加速计、GPS 等传感器。利用它们可以增强游戏体验。

我们是如何做到的:摇晃以执行特殊动作

《轩辕传说》使用加速计检测玩家何时摇晃设备。玩家在游戏过程中累积能量,然后在超级击杀攻击中释放。玩家可以通过摇晃设备来触发超级击杀,该攻击会在 10-20 秒内攻击附近的敌人。

我们测试了一些不同的摇晃动作,以测量加速计的典型值

图 6:四种摇晃动作,显示三个维度上的强度和持续时间

任何一个轴上的加速度超过 1.6 就被认为是摇晃。我们还可以使用每个轴上加速度绝对值之和。

由于这是真实世界事件,数据会有噪声且每次都不同。值包含长短摇晃。虽然我们的大多数测试摇晃都给出了一个峰值,但其中一个有几个接近峰值的值。此游戏使用任何轴上任何方向超过 1.6 的摇晃。1.5 秒内的多次摇晃会被分组为一个。

有了游戏中的这些代码,任何摇晃动作都会释放一个超级击杀动作。

轮到你了:使用系统的传感器

Ultrabook 和二合一系统包含许多传感器。发挥创意,思考如何利用它们来增强游戏体验。

无论你使用哪个(或哪些)传感器,都要校准它们,以了解它们在现实条件下的反应。考虑玩家将遇到的各种典型条件。

摘要

我们展示了如何将现有游戏适配到检测二合一系统的状态(笔记本电脑或کتابچه (tablet))。我们还演示了用户界面如何支持触摸,以及如何根据二合一系统状态在用户界面之间切换。再加上利用加速计触发独特游戏动作的功能,这些都提供了引人入胜的游戏体验。

腾讯冒着风险推出了首款支持触摸游戏的中国 MMORPG。这个风险得到了回报!《轩辕传说》在笔记本电脑、کتابچه (tablet) 和二合一系统上都表现出色。希望你的游戏也能取得类似的成功!

作者

Mack Han 是腾讯的游戏客户端软件工程师,拥有 10 年的游戏开发经验。他曾为主机、PC 和移动设备开发游戏。他多年来一直从事大型 3D MMORPG 的开发工作,专注于渲染和优化。

Cage Lu 是英特尔的应用工程师。他多年来一直与中国大型游戏 ISV 合作,帮助他们在英特尔®平台上优化游戏客户端性能和用户体验。

Paul Lindberg 是英特尔开发者关系部门的高级软件工程师。他帮助世界各地的游戏开发者发布优秀的、在英特尔平台上表现出色的游戏和其他应用程序。

参考文献

在二合一系统中检测کتابچه (tablet) 和笔记本电脑模式以及屏幕方向:http://software.intel.com/en-us/articles/detecting-slateclamshell-mode-screen-orientation-in-convertible-pc

更多关于适配二合一系统的详情
http://software.intel.com/en-us/articles/how-to-write-a-2 in 1aware-application

比较各种 Windows 8 触摸消息类型
http://software.intel.com/en-us/articles/comparing-touch-coding-techniques-windows-8-desktop-touch-sample

展示《战争游戏:欧洲扩张》触摸实现案例研究
http://software.intel.com/en-us/articles/wargame-european-escalation-performance-and-touch-case-study

触摸开发者指南
http://software.intel.com/en-us/articles/ultrabook-device-and-tablet-windows-touch-developer-guide

更复杂的触摸用例
http://software.intel.com/en-us/articles/hot-shots-warps-conventional-touch-gaming

许可证

Intel 示例源代码在 Intel Sample Source License Agreement 下提供。本文档部分内容受 Microsoft Limited Public License (微软有限公司公开许可) 的约束。

Intel®Developer Zone 提供跨平台应用程序开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员创新并取得成功。加入我们的社群,了解 物联网Android*Intel® RealSense™ TechnologyWindows*,下载工具,获取开发套件,与志同道合的开发人员交流想法,并参加黑客马拉松、竞赛、路演和本地活动。

Intel、Intel 徽标和 Ultrabook 是 Intel Corporation 在美国和/或其他国家/地区的商标。
版权所有 © 2014 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。

© . All rights reserved.