在monogame中处理第一人称游戏的鼠标

问题描述 投票:1回答:1

我正试图在Monogame上制作一个第一人称游戏,到目前为止,我在互联网上找到或找到的所有游戏都不符合我的标准。这就是我目前处理鼠标的方式:

        private void HandleMouse()
        {
            Vector2 mouseDifference;
            mouseNow = Mouse.GetState();
            if (mouseNow.X != mouseDefaultPos.X || mouseNow.Y != mouseDefaultPos.Y)
            {
                mouseDifference.X = mouseDefaultPos.X - mouseNow.X;
                mouseDifference.Y = mouseDefaultPos.Y - mouseNow.Y;
                leftrightRot += mouseSens * mouseDifference.X;
                updownRot += mouseSens * mouseDifference.Y;

                Mouse.SetPosition((int)mouseDefaultPos.X, (int)mouseDefaultPos.Y);

                UpdateViewMatrix();
            }
        }

        private void UpdateViewMatrix()
        {
            Matrix cameraRotation = Matrix.CreateRotationX(updownRot) * Matrix.CreateRotationY(leftrightRot);

            Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
            Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);

            Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);

            Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);


            viewMatrix = Matrix.CreateLookAt(new Vector3(0,0,0), cameraRotatedTarget, cameraRotatedUpVector);
        }

我的问题是,虽然这个解决方案有效,但是当涉及相机应该旋转多远时,它是非常不一致的。例如,当我用鼠标做圆圈时,发现有时鼠标随机跳跃超过预期。我在fps中的主要假设不一致导致帧之间的时间发生变化,从而影响鼠标在该时间内可以移动的距离。

我不知道这是否是原因,或者我的假设是否会导致这种情况,但我想找到一种方法来获得一致的鼠标移动。

如果需要,我可以提供问题的视频。

先感谢您。

c# monogame
1个回答
2
投票

Windows中的鼠标每秒更新240次。游戏循环以每秒60帧的速度运行。这种差异可能会导致大型鼠标增长。解决方案是限制鼠标增量的变化:

Vector2 mouseDifference;
const float MAXDELTA = 6; // Set to the appropriate value.
mouseNow = Mouse.GetState();
if (mouseNow.X != mouseDefaultPos.X || mouseNow.Y != mouseDefaultPos.Y)
{
    mouseDifference.X = Math.Min(MAXDELTA, mouseDefaultPos.X - mouseNow.X);
    mouseDifference.Y = Math.Min(MAXDELTA, mouseDefaultPos.Y - mouseNow.Y);
    leftrightRot += mouseSens * mouseDifference.X;
    updownRot += mouseSens * mouseDifference.Y;

    Mouse.SetPosition((int)mouseDefaultPos.X, (int)mouseDefaultPos.Y);

    UpdateViewMatrix();
}
© www.soinside.com 2019 - 2024. All rights reserved.