2D平台游戏的输入缓冲

作者:Case Portman(@Studio Thunderhorse, 独立游戏 Flynn: Son of Crimson的开发者)
翻译:highway★
原文:译文:GAMEMAKER STUDIO系列:2D平台游戏的输入缓冲


2D平台游戏的手感,咱们聊聊输入缓冲

“我按了跳!!”

“我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;    
    //检测player是否在地上
    if place_meeting(x,y+1,objSolid) vspeed =-5;//跳起
}

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

//Player跳跃
if (buffer_counter <buffer_max){
    //计数器每帧递增
    buffer_counter +=1;
    //检测player是否在地上
    if place_meeting(x,y+1,objSolid)  vspeed =-5;//跳起
}
//Player跳跃操作
//按下空格键
if keyboard_check_pressed(vk_space)  buffer_counter =0;//重置缓冲计数器

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

2021-04-28 15:15
Comments
Write a Comment