阐述HTML5游戏中的角色移动设定

作者:Mary Rose Cook

最近,我发布了我的2D射击/益智/平台游戏《Empty Black》。在本文中,我将介绍我们如何制作出灵活直观的角色移动。在看本文以前,读者最好能玩一玩《Empty Black》,以便更加理解我所说的内容。

我的一般做法是,先改变一些东西,然后再实验。我的调整办法参考了若干种资源。

一,我查看了其他2D平台游戏中的影响玩家角色移动的参数。比如,地面是否光滑?侧向移动对跳跃的比值是多少?角色是否加速移动?角色的跳跃高度是否受玩家按键时长的影响?角色撞上可移动的物体时是否会减速?

图1(from webappers)

二,我参考了其他2D平台游戏中的玩家角色的特殊行为。在《超级食肉男孩》中,角色抵墙而跳时会自动从墙上跳开。在《洞穴探险》中,角色可以越过平台。在《恶魔城》中,角色腾空时也可以再次跳跃。

三,我让别人试玩。Kemal告诉我,角色移动应该很容易,特别是,如果角色撞到墙面时,角色应该跌倒。Ricky告诉我,玩家不能控制角色的跳跃高度,这太奇怪了。他演示给我看,当角色跃过在矮小的房间里的障碍物时, 角色的头撞上了天花板。Ricky还指出,当角色跳跃后着陆时,减速的效果很不好。所有人都告诉我腾空移动太敏感,以及墙跳太麻烦。

四,我阅读了程序员写的关于角色移动算法的文章。那些文章主要是简短的评论,而不是深入的分析。因此,我才写了本文。

对于算法,简短地说就是做一些小破解。

详细地说,就是下面的内容:

玩家按下跳跃键。第一个问题是:角色可以跳跃吗?这意味着:角色是否与任何可作为起跳点的物品接触?《Empty Black》使用Box2D控制游戏世界的物理。任何移动都受制于Box2D的摩擦力和重力模型。另外,Box2D会处理 碰撞物品的反应:反弹、推挤、旋转和滑动。游戏可以通过Box2D得知某个物品接触到了哪一个物品。如果角色碰到的是坚固的物品,那么它就会跳起来。

但是,跳跃的情况没有这么简单。角色不仅可以从地面起跳,也可以墙跳,也就是,角色先落在墙上,以之为立足点,再次跳离墙面。

图2(from webappers)

让角色跳出狭窄的垂直通道时经常使用这个技术。它使角色可以反复地在垂直、平行的墙面之间跃跳上升。

图3(from webappers)

这个能力是受限制的。玩家可能会跳离一个墙面后却又落在相同的墙面上。此时,角色可能就不能再次起跳了。如果玩家试图让角色再次起跳,角色就会摔下来。这里的反弹是为了改进玩法。如果我可以利用坚固墙面不能攀 爬的性质,那我就能轻易地设计出有趣的关卡。

反弹使玩家更难决定角色是否有可靠的立足点。玩家应该能够随心所欲地让角色在地面上跳跃。但角色不能连续在相同的墙面位置上跳跃两次。

幸运的是,Box2D有一个超自然物理对象来弥补墙体、敌人和子弹的不足,即传感器。这个灵体没有物理实体。它存在于空间中,能够暂时储存碰撞运动。程序员可以通过它了解碰撞,就像通过有形实体一样。

我要做的就是,给角色的按键附加一个宽泛而短时的传感器。如下图所示:

图4(from webappers)

注意,传感器与地面重叠。

现在,游戏不需要通过角色对象感知碰撞活动,而是通过角色的按键传感器。

那有什么帮助?没有。但我可以在一个角色上添加另外两个传感器,一边一个。

图5(from webappers)

这意味着游戏可以通过传感器得知角色是否接触到其他物品。如果按键传感器接触到可作立足点的坚固实体,那么角色就可以起跳。如果只有一边的传感器接触到坚固实体,那么游戏就会进一步调查。

除了以下两种情况,角色都可以跃跳。

一,角色落在他刚刚才起跳的墙面位置上。

图6(from webappers)

游戏会保留传感器感知到的最后一次起跳点的记录。如果是一边的传感器,且角色使用相同的传感器记录当前的立足点,那么角色就不能再次起跳了。

如果玩家在角色墙跳上升时松开控制键,角色就会开始下落。玩家在角色下落到墙面时可能会按起跳键。有可能此时的墙面正是角色刚才起跳的墙面。如果是,那么角色将无法起跳。然而,有一个例外,如果角色的位置比上一次跃跳的位置低,那么他就仍可以起跳。这个例外让玩家得以弥补自己的操作失误,使操作更加人性化。

二,角色着陆并暂时停留在墙面上。玩家继续按方向键,使角色抵在墙面上,然后再按跃跳键。这时,角色是不允许起跳的。此时,角色将会做出如下图所示的滑行动作:

图7(from webappers)

为了停止角色的滑行,如果玩家没有把角色按在墙上的话,游戏就允许角色起跳。

有一个例外:如果角色接近墙面顶部,角色就可以跃跳。此时,角色会沿着墙面上滑行。

图8(from webappers)

游戏现在知道角色是否允许跃跳了。为了响应跃跳,上向的力量是瞬间产生的。当角色刚开始移动时,它的速度会很快。由于重力作用,这个速度会逐渐变慢。当角色腾空到某一段高度,向上的力量就会完全消失,角色随之 开始下落。

如果玩家在角色达到跃跳的最大高度以前松开跃跳键,那么角色就会马上下落。这个想法我借鉴了《超级食肉男孩》。如果角色跳得太高,结果就会是,玻璃天花板插入角色的头部。这使得玩家不得不控制好跃跳的高度,以免角色撞个头破血流。

跃跳力量的大小通常是恒定的。然而,在以下两种情况中,这个力量会增加。

一,当角色携带板条箱时。这使得负重角色无法跃跳,而变成笨拙的兔子跳。

二,当角色比通常情况更快下落时。想象一下,角色正要墙跳,因为玩家的笨拙,角色落到的墙面位置比刚才的起跳点低。为了帮助玩家弥补这个失误,角色接下来的墙跳力量会比正常情况下的大。这股力量与正常力量的差距和正常下落的力量与实际下落的力量之间的差距成正比。

现在,再说说侧边移动。

玩家按下左方向键。然后呢?

<

p >角色会持续产生一股向左的力量,直到玩家松开方向键。这股力量的大小取决于角色当前移动的速度。如果角色的速度达到最大,那就不会产生力量。如果角色是静止的,那么这股力量就会很大。这个操作的关键是,尽可能快地让角色达到最高速度,然后保持最高速度。这使得玩家更容易预