C# monogame中第一人称游戏的鼠标操作
我正在尝试在Monogame上制作一个第一人称游戏,但到目前为止,我在互联网上看到的所有东西都不符合我的标准。 这是我目前处理鼠标的方式:C# monogame中第一人称游戏的鼠标操作,c#,monogame,C#,Monogame,我正在尝试在Monogame上制作一个第一人称游戏,但到目前为止,我在互联网上看到的所有东西都不符合我的标准。 这是我目前处理鼠标的方式: private void HandleMouse() { Vector2 mouseDifference; mouseNow = Mouse.GetState(); if (mouseNow.X != mouseDefaultPos.X || mouseN
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中的不一致导致帧间时间发生变化,从而影响鼠标在该时间内移动的距离
我不知道这是否是原因,或者我的假设是否会导致这种情况,但我想找到一种方法来获得一致的鼠标移动
如果需要,我可以提供问题的视频
提前谢谢。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();
}
这是一个旧线程,但我想我会分享一个解决方案。对我来说,这个解决方案就是使用GameTime对象来关联玩家应该旋转多少圈。换句话说,旋转(delta*rotationSpeed*GameTime.ElapsedTime.TotalSeconds),这样每个旋转都与自上一帧以来经过的时间有关。这可以防止框架掉落,我发现这一直是我的问题。我觉得设置一个限制鼠标增量只是通过制造另一个来解决一个问题,我相信在快速移动鼠标时,制造一个最大鼠标增量也是一个问题,而不是旋转过多,它的旋转比它应该的要少。@Aofekiko,我所知道的唯一的其他方法是将底层操作系统挂钩,并在代码中提供回调函数。这不是线程安全的,不可移植,并且可能会被防病毒软件标记。