译文|Gamemaker Studio系列:2D 平台游戏的输入缓冲

作者:highway★
2018-11-19
53 61 5

作者:Case Portman(@ Studio Thunderhorse, 独立游戏 Flynn: Son of Crimson的开发者)

翻译:highway★

“”我按了跳!!
                     我 TM 按了跳键,我 C%^&#@%#@&*,
                                       你 TM 倒是跳啊!!!,我%#^@&!"


耳熟么?我注意到很多 2D 平台游戏手感很好......但是也有很多游戏的手感挺糟的。

2D 平台中对手感比较重要的两个东西,一个是“输入缓冲”(input buffering),还有一个是它的哥们儿“土狼时间 ”(coyote time)。

土狼时间是什么呢?就是当玩家走出平台边缘,跳键按得太晚,但是跳跃仍然有效。这是2D 平台游戏开发的一个术语。(译注:当然中文搜索基本上是搜不到的,如果你感兴趣,可以 google 一下,gamasutra 上有一些关于跳跃的开发技巧文章会有更详细的解释。)

下面,咱们说说到底什么是输入缓冲。

输入缓冲(Input Buffering)

这个术语用于给输入一个指令(在我们的例子中,按一个按钮)以保留在内存中,直到它能够执行这个指令。最好的例子是在很短的时间内,让玩家可以按下跳跃按钮,一旦他们落地,角色就会跳跃。

让我们通过使用简单的2D 平台游戏实现一下上面提到的东西。如果你已经实现了你玩家跳跃代码,那么你很可能是这么做的:“如果玩家在地上 -> 那就可以跳 -> 跳”,这是一个完美的开始,我们现在要做的就是简单的洗洗牌~

//Player 跳跃代码

if place_meeting(x, y+1, objSolid)      //检测 player 是否在地上,注:当然你也可以用脚本
{
    if keyboard_check_pressed(vk_space) //按下空格键
        vspeed = -5;                    //跳起
}

译注:教程这里用 vspeed 只是为了省事儿,建议自定义速度变量

我们首先要在什么都没开始之前声明两个变量,buffer_counter 和 buffer_max,后面我可以对其进行调整。

在 create 事件中加上:

buffer_counter = 0 //
buffer_max = 10   //

接下来我们要改一下跳跃代码,加上上面的变量:

//Player 跳跃
if (buffer_counter < buffer_max)
{
    buffer_counter +=1;    //每帧递增

    if place_meeting(x, y+1, objSolid)  //检测 player 是否在地上
        vspeed = -5;                    //跳起
}

我们现在加上触发跳缓冲的按钮。你可以自己选个按键,我在这用了空格键。在 step 事件中的任何位置添加它,我建议接近上面的代码以保持整洁。

//Player 跳跃
if (buffer_counter < buffer_max)
{
    buffer_counter +=1;                 //计数器每帧递增

    if place_meeting(x, y+1, objSolid)  //检测 player 是否在地上
        vspeed = -5;                    //跳起
}

//Player 跳跃操作
if keyboard_check_pressed(vk_space)     //按下空格键
    buffer_counter = 0;                 //重置缓冲计数器

WA-啦!现在,即使你在降落前按下跳跃按钮达 10 帧,我们的跳跃也会有效,很酷吧?只需几行代码,我们就能让我们的跳跃响应更快。输入缓冲可不是这一个用途,你可以将它添加到你任何喜欢的东西里,如攻击,躲闪,甚至导航菜单。希望这个迷你教程有所帮助!

本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. 金盟 2018-11-19

    期待土狼时间的讲解!

    • highway★ 2018-11-19

      @金盟:土狼时间 伪代码
      // Character’s Create Event
      var coyoteTimer = 0;

      ...

      // Character’s Update Event
      if (cBelow)
      coyoteTimer = 0;

      var numCoyoteFrames = 4;

      if (kJump && (coyoteTimer < numCoyoteFrames))
      {
      Jump();
      coyoteTimer = numCoyoteFrames;
      }

      ++coyoteTimer;

      最近由 highway★ 修改于:2018-11-19 21:06:47
    • 金盟 2018-11-20

      @highway★:非常感谢!

  2. inkcomic 2018-11-23

    兄弟,感谢分享

  3. Onyx 2020-03-03

    感谢分享

您需要登录或者注册后才能发表评论

登录/注册