我正在尝试在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不一致会导致帧之间的时间发生变化,从而影响鼠标在该时间内可以移动的距离。
我不知道这是原因还是我的假设甚至可能导致这种情况,但是我想找到一种方法来获得一致的鼠标移动。
如果需要,我可以提供有关该问题的视频。
谢谢。
答案 0 :(得分: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();
}
答案 1 :(得分:1)
这是一个旧线程,但我想我会分享一个解决方案。对我有用的解决方案是使用 GameTime 对象来关联玩家应该旋转多少。换句话说,旋转 (delta * rotationSpeed * GameTime.ElapsedTime.TotalSeconds) 以便每次旋转都与自上一帧以来经过的时间有关。这可以防止掉帧,我发现这对我来说是个问题。