为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
千万里不及你 2022-12-24 10:13:46
我正在尝试在 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 的不一致导致帧之间的时间发生变化,从而影响鼠标在该时间内可以移动的距离。我不知道这是否是原因,或者我的假设是否会导致这种情况,但我想找到一种方法来获得一致的鼠标移动。如果需要,我可以提供问题的视频。先感谢您。
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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

}


查看完整回答
反对 回复 2022-12-24
?
动漫人物

TA贡献1815条经验 获得超10个赞

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



查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信