【问题标题】:Handling mouse for first person game in monogame在单人游戏中处理第一人称游戏的鼠标
【发布时间】:2019-04-20 21:08:15
【问题描述】:

我正在尝试在 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】:

    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();
    }
    

    【讨论】:

    • 我觉得设置一个限制鼠标增量只是通过制作另一个问题来解决一个问题,我相信在快速移动鼠标时制作一个最大鼠标增量也会是一个问题,这次而不是旋转更多比它应该的,它会旋转得比它应该的少。
    • @Aofekiko,我知道的唯一其他方法是挂钩底层操作系统并在您的代码中提供回调函数。这不是线程安全的、不可移植的,并且可能会被防病毒软件标记。
    【解决方案2】:

    这是一个旧线程,但我想我会分享一个解决方案。对我有用的解决方案是使用 GameTime 对象来关联玩家应该旋转多少。换句话说,旋转 (delta * rotationSpeed * GameTime.ElapsedTime.TotalSeconds) 以便每次旋转都与自上一帧以来经过的时间有关。这可以保护它免受丢帧的影响,我发现这对我来说一直是个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2019-08-05
      • 1970-01-01
      • 2019-05-28
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多