RSS

游戏里面跳跃的设计和实现心得

18 Jun

引言

在很多游戏中,尤其是在2D游戏中,跳跃是一个很重要的元素,我们经常能看到角色能跳到2倍甚至3倍于其身高的惊人高度,甚至还有二段跳,无线段跳的出现。本片文章就是介绍我在制作2D游戏中打磨玩家控制角色的跳跃得出的一些心得。

在实现跳跃的过程中,一般程序员能控制的物理变量有2个,一个是重力加速度g,一个是玩家起跳的初始速度V,而通过这2个参数以及跳跃机制的设计,开发者需要设计出各种各样的复杂的满足各种要求的而且手感很好的跳跃。一般来说,需要满足的要求有最大的腾空高度,最长的腾空时间等等。

1. 简单实现

    生活环境中的跳跃,不考虑除重力以外的因素(例如空气阻力等等)的话,跳跃应该是一个优美的抛物线,也就是满足一个二次函数。那么在游戏中的实现,最直接的就是在每一次update里面匀速修正角色在Y轴上的速度,然后再计算出当前角色应该出现的位置。简单地用公式表达如下:

    clip_image002[5]

    如果update是一个fixed update,那么这个公式就可以完美地模拟出抛物线般的跳跃. 对于设计师来说,他最关心的是玩家能跳多高,在空中跳多久,而这2个属性在这种跳跃中能够跳到的最大距离和按下跳跃时给出的初始速度相关,相关的设计师很注重的数值的计算公式如下:

    clip_image004[1]

    clip_image006

    clip_image008

    根据上面的公式来确定和调整参数,设计师就可以做到他们想要的效果。但是这样的简单的跳跃只能有一个跳跃的高度,并没有区分所谓的大跳和小跳,功能很简单。

    2. 区别力度的跳跃

      在很多游戏中,跳跃的高度其实并不是像第一种实现中是一个固定的高度,而是根据玩家按键时间的长短来决定跳跃的高度,看起来这种实现应该也不难,但是其实这是一个与现实生活相违背的设计挑战。在现实生活中,你想跳跃的高度是在你起跳的那一瞬间决定的,而不是看你在空中是否一直加力,这并不能加大你弹跳的高度。但是在游戏中,如果想设计成玩家跳跃的高度是一段均匀的值而不是单纯的一个或者两个固定的高度的话,按键的长短是比较自然和符合直觉的一种判定,因为你一直按着跳跃,角色应该要能跳得更高。

      那么问题就来了,怎么实现这种跳跃呢?很原始的想法就是不但在按键的第一帧给出初速度,还要在玩家后面按键的一段时间范围T内,持续地人为地干涉速度,使得能够实现按键的时间越长,跳跃的高度和腾空时间就越长。这样,设计者可以操纵的参数在原来简单实现的基础上多了一个响应时间范围T。

      也就是说,符合下面的公式

      2011-6-18 17-18-32

      其中f(t)是关于按键时间的函数,随着时间的推移,f(t)函数会给出不同的值来修正速度。根据f(t)的不同,我们可以实现不同的效果,假定T是所能响应的最长时间,即0 ≤ t ≤ T, 并且满足时刻为T时,V ≤ 0, V小于0时是上升的速度。

      2.1. f(t)为一个一次函数

      如果f(t)是一个一次函数at + b,那么也就意味着在一段按键时间内,玩家受到的重力和没有按键时受到的重力是不一样的,没有按键的时间受到的重力大,而按键的时候受到的重力小。这样做,确实可以让按键和没有按键达到的高度不一样在这样的设计下,设计师能控制的参数为初始速度V和常量a以及响应时间T,一些重要数值的计算公式如下: (我们忽略常数b,是因为其实调整b就是调整初始速度V,它们是等效的)

      2011-6-18 17-12-37

      由以上的公式可以看出设计师通过操纵a和T就可以让控制跳跃的大部分属性。其中V的值为负数,其余的值一般为正数.

      这种设计给玩家带来的跳跃的感觉类似于一种火箭背包式的跳跃,因为一旦你跳跃的时间按住键不放,其实是重力加速度变小了,就好像玩家身上背了一个火箭背包在喷射帮助其起飞一样的感觉。此外,玩家一旦手放开,玩家并不会停止上升,造成的手感是比较难精确地控制高度,不过这样的手感也是很独到的,玩家也能够理解。最重要的是,这样的跳跃是火箭背包跳的一种简单有效的实现方式。

      2.2 f(t)为一个二次函数

      如果f(t) = at2 + bt + c,那么相应的3个数值的计算公式如下(同样,我们忽略常数c,是因为调整c和调整初始速度V,它们是等效的):

      2011-6-18 17-14-20

      这种设计在一定程度上消除火箭背包般loose的感觉,随着玩家按键的时间推移,角色受到的重力加速度会越来越大,这样平滑改变的重力加速度的设计会让玩家感觉到舒服不是那么突兀。然而,虽然这样的设计在数学上已经可以接受,但是作为设计师,从玩家的角度来看的话,这样的跳跃还是会有一些loose的感觉,为什么呢?那是因为一旦玩家停止按键,玩家并不会马上就开始往下掉,还是会继续上升一段空间。的确,精心调整数值a,b,V以及T可以让那些玩家不可控的最后一段上升时间变得很小,但是始终还是会存在这么一段玩家不可控的loose时间,如果有意让弹跳变得比较需要技巧是可以这样做,因为不可控意味着不能精确地控制,这是一个对技巧的要求。

      2.3 Mario式的跳跃

        众所周知,Mario的跳跃是一种很tight的跳跃,在整个跳跃的过程中,在上升期间,玩家基本感觉不到loose的不可控时间,并且玩家也确实地感觉到了mario跳跃时的稳重的重量感,那么这样的手感是怎么做出来的呢?

        其实和我们上面所讨论的数学近似的方法不一样,mario用的是一种hack的方式来加强玩家的手感。在Mario中,速度的公式就是我们上面讨论的简单实现的公式,即:

        clip_image002[6]

        但是玩家一旦松开按键,那么不论目前的速度是多少,将目前的速度置为一个较小的速度,使得角色可以几乎马上就到达最高点,也就说几乎玩家松开按键后的极短时间内角色就达到最高点,然后开始下掉,这样极大地减少了不可控的上升段的loose时间,使得在上升的过程中都是比较tight的操作手感。此外,为了加强角色的重量感觉,在下降的过程中,角色所受到的重力加速度为上升的3倍,这样下降得更快,更进一步减少了玩家的不可控时间,所以玩家在整个跳跃的过程中基本都是精确可控的,所以就营造了这样的tight的手感。

        对mario中跳跃的下降部分,我们得到一些启发,为了营造mario良好的手感,特意减少了下落的时间,并且这样的做法极大地增强了mario的重量感,让人感觉跳跃不是一个轻飘飘的过程,虽然在数学上与现实生活不符,但是玩家的感觉却是真实和可信的。

        其实,手感在好坏很大程度在于real time的response,换句话说,就是loose的时间长短,如果让玩家察觉到了与直觉不符的loose不能控制的时间,那么就是不舒服的手感,有时候游戏和生活的经验不一定要一致吻合,为了营造好的手感,设计师可以尽量减少不可控的时间,尽管这段时间是现实生活中存在的,是和生活经验吻合的。

        Advertisements
         
        Leave a comment

        Posted by on June 18, 2011 in Game

         

        Tags: , ,

        Leave a Reply

        Fill in your details below or click an icon to log in:

        WordPress.com Logo

        You are commenting using your WordPress.com account. Log Out / Change )

        Twitter picture

        You are commenting using your Twitter account. Log Out / Change )

        Facebook photo

        You are commenting using your Facebook account. Log Out / Change )

        Google+ photo

        You are commenting using your Google+ account. Log Out / Change )

        Connecting to %s

         
        %d bloggers like this: