作者: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 帧,我们的跳跃也会有效,很酷吧?只需几行代码,我们就能让我们的跳跃响应更快。输入缓冲可不是这一个用途,你可以将它添加到你任何喜欢的东西里,如攻击,躲闪,甚至导航菜单。希望这个迷你教程有所帮助!
期待土狼时间的讲解!
@金盟:土狼时间 伪代码
最近由 highway★ 修改于:2018-11-19 21:06:47// 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★:非常感谢!
兄弟,感谢分享
感谢分享