前言
最近学游戏开发时,知道了这个经典的BUG,中文互联网上似乎很少见到关于这个BUG的内容,于是有了这篇文章。
Strafe 40 bug
Strafe 40 bug是一个来自FPS游戏的鼻祖Doom的著名bug,向前移动同时向任意方向(左右)移动,速度会提升28%,还有同样的Strafe 50 bug。
原理
在Doom的源代码中,用来控制玩家移动的部分用两个if表达式分别处理向前移动和左右移动的输入,当玩家同时输入时两个语句都会被执行。
void P_MovePlayer (player_t* player)
{
ticcmd_t* cmd;
cmd = &player->cmd;
player->mo->angle += (cmd->angleturn<<16);
// Do not let the player control movement
// if not onground.
onground = (player->mo->z <= player->mo->floorz);
if (cmd->forwardmove && onground)
P_Thrust (player, player->mo->angle, cmd->forwardmove*2048);
if (cmd->sidemove && onground)
P_Thrust (player, player->mo->angle-ANG90, cmd->sidemove*2048);
if ( (cmd->forwardmove || cmd->sidemove)
&& player->mo->state == &states[S_PLAY] )
{
P_SetMobjState (player->mo, S_PLAY_RUN1);
}
}
此时最终表现出两个方向的速度向量合成,最终的速度为:
