前言

最近学游戏开发时,知道了这个经典的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);
    }
}	

此时最终表现出两个方向的速度向量合成,最终的速度为:

(402+502)=64\sqrt{(40^2 + 50^2)} = 64

参考文章