如何在FPS游戏中计算游标增量?

时间:2013-05-23 17:54:53

标签: c# xna

我正在制作一个XNA游戏,我希望当按住鼠标按钮时光标停止。现在通过将光标位置每隔1/60秒设置到某个位置会使光标看起来有些滞后,有时如果光标移动得足够快以到达屏幕边框,从那一刻起直到下一个位置重置三角形位置为没有正确计算。此外,从屏幕边缘开始并向同一边缘移动将无法获得任何正确的增量。

如何获得正确的光标增量而不会因光标停在屏幕边缘而感到沮丧?

2 个答案:

答案 0 :(得分:4)

如果您锁定鼠标的位置太靠近边缘,则表示运气不佳。

我建议你在拖动动作开始时隐藏光标,保存位置并秘密地将光标移动到屏幕中心。拖动结束时,只需将光标恢复到之前的位置即可。

答案 1 :(得分:4)

很容易,假设我理解你的意思。

为了根据鼠标移动第一人称相机,我们需要计算每帧的增量,然后将鼠标移回屏幕中心。

为此,我们将存储屏幕中心的位置。我们还需要一个MouseState变量和一个偏航和一个音高浮动来存储我们当前的相机旋转。我也想根据游戏的分辨率设置旋转速度:

MouseState currentMouseState;
Vector2 screenCenter;
float YrotationSpeed;
float XrotatiobSpeed;
float yaw = 0;
float pitch = 0;


...


protected override void LoadContent()
{
    YrotationSpeed = (float)graphics.PreferredBackBufferWidth / 10000.0f;
    XrotatiobSpeed = (float)graphics.PreferredBackBufferHeight / 12000.0f;

    screenCenter = new Vector2(graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height) / 2;
}

现在,要计算鼠标在最后一帧中的移动量,我们将使用此功能:

private void HandleMouse(GameTime gameTime)
{
    currentMouseState = Mouse.GetState();
    float amount = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
    if (currentMouseState.X != screenCenter.X)
    {
        yaw -= YrotationSpeed * (currentMouseState.X - screenCenter.X) * amount;
    }
    if (currentMouseState.Y != screenCenter.Y)
    {
        pitch -= XrotatiobSpeed * (currentMouseState.Y - screenCenter.Y) * amount;
        if (pitch > MathHelper.ToRadians(90))
            pitch = MathHelper.ToRadians(90);
        if (pitch < MathHelper.ToRadians(-50)) //Preventing the user from looking all the way down (and seeing the character doesn't have any legs..)
            pitch = MathHelper.ToRadians(-50);
    }
    Mouse.SetPosition((int)screenCenter.X, (int)screenCenter.Y);
}

最后:

要更新相机并查看Matrix,您可以使用以下功能,该功能应在我们更新偏航和俯仰后执行:

public void UpdateCamera(float yaw, float pitch, Vector3 position)
{
    Matrix cameraRotation = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw);

    Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
    Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
    Vector3 cameraFinalTarget = position + cameraRotatedTarget;

    Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
    Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);

    view = Matrix.CreateLookAt(position, cameraFinalTarget, cameraRotatedUpVector);
}

编辑:好吧,当我重新阅读这个问题时,我意识到我的回答并不是你所要求的。尽管如此,它确实显示了如何计算鼠标增量而不会到达屏幕的边界。

为了符合我对你问题的回答,你所需要的只是微小的调整。

顺便说一下,除非你愿意在屏幕中间画一个鼠标的图像,否则任何有用的东西看起来都会有些迟钝。 因此,我强烈建议你隐藏光标。 为此,只需添加以下行:

this.IsMouseVisible = false;