键盘毕竟不是手柄
周末在写 demo ,为了给同事示范我希望得到的操作手感。作为一个能写点程序的游戏设计者,自己随时实现出来看看恐怕是不可多得的优势了。
我们的游戏有一定的动作成分在里面,所以我不想采用鼠标控制角色的行动,以对拍砖头的形式表现格斗场面。本质上我更偏好 console game 和游戏手柄的操作感。不过在 PC 平台上,手柄并不普及,只能在最普及的输入设备——键盘和鼠标上下点工夫了。
手柄控制方向主要有两种:
其一是模拟杆,在 PSP ,PS ,Wii 等手柄上均有安装。好处是至少可以感知两级力度,并可提供非常细的方向信息输入。控制游戏角色行动时,操作感很不错。
鼠标通过移动可以提供方向信息,甚至通过移动速度可以模拟出力度的差别。但毕竟鼠标缺乏力的反馈,且必须通过移动才能提供信息,本身不能保留状态(鼠标的 button 可以提供状态,所以很多 fps 把前进操作设置在鼠标的按键上),和手柄的感觉还是差了很远。
btw, IBM 的 TrackPoint 如果特别针对去开发,其实是个不错的游戏输入设备,可惜还是太专有化了。
其二,就是类似任天堂的十字键。由于有专利,到别的厂家那里换成了其它形式,不过大体还是差不多的。这类设备可以精确的输入八个方向,在格斗游戏中用的最多。比如我的最爱 VF4 EVO 的 PS2 版,干脆就禁止了模拟杆的输入,只允许用八方向键。
对应到 PC 上,大多数游戏用 WASD 四个按键模拟这个设备。不过要小心的是,由于键盘硬件设计的缘故,大多数键盘处理三个以上按键同时按下时,会发生所谓锁键问题。比如我的 DELL 键盘,同时按下 W 和 D 键后,再按 E 键,系统就接收不到 E 键的消息。这类情况试硬件决定,不同键盘处理能力不同。据说有比较强悍的键盘可以处理任意 7 个按键同时按下的消息,我就没有试过了。
好在现在的键盘处理两个按键的能力还是绰绰有余的,用 WASD 模拟八个方向的输入足够了。
游戏和普通应用软件是不同的。道理大家都明白,但是很少人仔细考虑。虽然游戏依旧是程序,只需要人来提供输入(鼠标键盘的控制),软件提供输入(明白显示)。但是,我们不能忽略人。人在游戏时是系统的一部分,我们提供的输入不仅仅是数据信号,而是恰当的时机提供的恰当的数据序列。这也是我反复强调过的,时间因素在游戏软件中的重要性。
普通的 OS 并不是为游戏设计的,输入设备的界面能获得的仅仅是数据而已,而缺乏时间上的控制(需要我们在应用层上额外编写代码实现)。当然也不绝对是这样:比如 Windows 可以在 OS 级处理双击消息就是一个例外。
console 平台上,也能看到双击这种操作。许多动作游戏把双击前进设定为跑步或冲锋。不仅如此,我们还能找到操作跟时间相关的很多例子。比如在许多游戏里,长按和短击按钮往往是有区别的。例如在 PSP 版《怪物猎人》中,短击 L 键是切换镜头,而长按 L 键则和镜头控制完全没关系,变成了切换物品。
操作手感是许多种类游戏的灵魂所在,如果你不同意这点,也该看看 Wii 和 NDS 是怎样改变游戏机市场的格局的。当然我们也不必过于埋怨 PC 的输入设备的落后,很多情况只是做游戏软件的态度。许多游戏之外的软件其实已经做了许多,比如我最爱的浏览器 Opera ,让我钟情于它的就有方便的鼠标手势。好好想想,键盘鼠标上都可以做许多文章呢。
下面写写周末做的一些工作和想法,做个记录:
当我们用 WASD 来模拟八方向键时,会遇到一些问题。
通常,我们有两键同时按下来模拟斜向的方向。比如 W 和 D 一起按下,相当于右上。可问题在于,“同时”这个概念本身就不存在。莫说人不可能同时做到把两个按键“同时”按下;实际上 OS 提交的键盘输入数据里 W 和 D 键总有个先后到达。
如果这个问题还不足以引起你的注意,那么看下一个:如果我们同时按下了 A 键及 D 键,逻辑上应该如何处理?在游戏手柄上我们永远无法同时触发左方向和右方向,但是键盘上却可以轻易做到。
最终,我是这样做的。
我们必须记录所有按键的先后次序,并保留每个按键的状态(是按下还是松开)。用一个队列来记录按键次序,每次一个新的方向键(WASD 四个键中的一个)按下,都把这个键放到队列的顶端。然后依次检查队列,查找是否有关联键存在。所谓关联键,就是可以与当前按键发生联动的按键。比如 W 键可以和 A 键或 D 键联动。由于一个键可能和多个键联动,那么,就应该按按键次序来处理,只保留最近的一次联动。
当接收到按键送开的消息时,遍历队列,将相关的所有按键及按键组合去掉。
程序从队列顶端拿到当前的按键或按键组合信息。
这个设计保证了所谓格斗游戏的键盘划弧的正确性,当你依次按下了左(A)和下(S)后,继续按右(D)键时。如果没有即使松开左键,导致三键同时按下,我们可以取到最自然的逻辑:右下(下和右联动)而忽略掉多余的按键“左”。当我们按住左和下,同时点击右键(注意:这种操作输入三键同时触发,不是所有键盘所有按键组合都可以正确处理)时,也可以有自然的视觉反馈:它相当于在右下和左下两个方向间切换。
此外,我还做了另一些尝试。
键盘无法做到手柄那样识别力度,那么我们只能从时间控制上做点文章。比如,我们可以区分按键的快速击打与长时间压放。并能够记录指令的次序。
例如,可以将长压 W 来控制角色前进。如果在前进的过程中按 S 的话,则可以认为是后退。但若立刻松开 W 这个前进按纽则认为是要做转身向后的动作。如果只是在前进过程中速击 S 后退键,又可以认为是闪避。仅仅只是两个按键,通过不同的时序组合却可以做出三种以上的动作来。
好好挖掘的话,键盘甚至可以做出比手柄更灵活操作方式。不要把键盘上的键看作一个个独立的按键,而应去想象五根手指的运动(暂且认为另一支手要握着鼠标),我想能发现更多。
切莫以为设计的复杂会给最终用户带来困扰。用四个键去控制八个方向,比设定八个(甚至更多)方向键在很多环境下要更体贴。毕竟人只有五根手指,通常我们只使用其中的三根操作方向键。用户比你想象的善于学习,只要给他们的操作提供足够的视觉反馈,并且让所有的操作都有最自然的含义,而非惊奇。这样,用户在学习操作的过程中就不会有太多的记忆负担,乐于接受。
最后谈谈鼠标。
不知道有多少人记得很多年前的《刀剑封魔录》,不知道它是否借鉴了 Opera 中的鼠标手势,用鼠标划大招的设计终归是很不错的。可惜制作组去了搜狐后没有在游戏的操作感上继续挖掘下去。
我们总觉得鼠标是一个 2D 定位设备,操作系统总能提供鼠标光标的绝对坐标。但实际上,鼠标本质上只能提供相对运动信息。就好比 Wii 的手柄,它提供的仅仅是你挥动它的加速度,并不能感知手柄在空间中的移动速度。是 OS 提供的编程接口误导了程序员。我们要挖掘鼠标作为游戏输入设备的能力,就要先看清这个本质。
用鼠标画过图的人应该有体会,就算是画个简单的圆,不借助软件工具也是很困难的。甚至远不如笔方便。我想拿是因为,手握着笔时,是用三跟手指在控制,可以做出精细的角速度变化。而捏着鼠标则是用手腕,手腕能提供的移动的直线速度控制。也可以做到较为精确的平面定位。但不容易把握角速度。而可惜的是,鼠标本身并不能获得绝对坐标。我们用鼠标操作 FPS 游戏时,也多利用的是直线上速度控制这一点。
我们采集鼠标的输入数据时,就不可以孤立的记录每次的运动绝对方向。要知道短时间内,两次方向数据即使有区别,那很可能是人手腕的局限性造成的。足够可信的数据是鼠标在短期内速度方向的大幅度改变,例如逆向移动,和顺/逆时针切向运动。大体上,我们能采信的角度改变只此三个状态而已,而不能把角速度作为线性变化的输入数据来看待。
但另一方面,鼠标线速度的区别则可以相对可信一些。不少台球游戏用它来控制出杆力度,玩家经过适应后可以获得不错的手感。
今天累了,不往下写了。
Comments
Posted by: a_single_sail | (16) February 23, 2008 07:58 PM
Posted by: 胡章优 | (15) February 23, 2008 05:26 PM
Posted by: FUChang | (14) February 22, 2008 09:57 AM
Posted by: 高俊 | (13) February 21, 2008 11:06 PM
Posted by: 54sun | (12) February 20, 2008 11:12 PM
Posted by: rockcarry | (11) February 20, 2008 01:35 PM
Posted by: rockcarry | (10) February 20, 2008 01:03 PM
Posted by: 54sun | (9) February 20, 2008 05:50 AM
Posted by: 星际 | (8) February 19, 2008 02:40 PM
Posted by: rockcarry | (7) February 19, 2008 01:20 PM
Posted by: sjinny | (6) February 18, 2008 11:00 PM
Posted by: hlst | (5) February 18, 2008 10:23 PM
Posted by: chinainvent | (4) February 18, 2008 01:58 PM
Posted by: nothanks | (3) February 18, 2008 09:24 AM
Posted by: playersong | (2) February 17, 2008 11:47 PM
Posted by: 网友 | (1) February 17, 2008 09:58 PM