我正在制作一个XNA游戏,我希望当按住鼠标按钮时光标停止。现在通过将光标位置每隔1/60秒设置到某个位置会使光标看起来有些滞后,有时如果光标移动得足够快以到达屏幕边框,从那一刻起直到下一个位置重置三角形位置为没有正确计算。此外,从屏幕边缘开始并向同一边缘移动将无法获得任何正确的增量。
如何获得正确的光标增量而不会因光标停在屏幕边缘而感到沮丧?
答案 0 :(得分:4)
如果您锁定鼠标的位置太靠近边缘,则表示运气不佳。
我建议你在拖动动作开始时隐藏光标,保存位置并秘密地将光标移动到屏幕中心。拖动结束时,只需将光标恢复到之前的位置即可。
答案 1 :(得分:4)
很容易,假设我理解你的意思。
为了根据鼠标移动第一人称相机,我们需要计算每帧的增量,然后将鼠标移回屏幕中心。
为此,我们将存储屏幕中心的位置。我们还需要一个MouseState变量和一个偏航和一个音高浮动来存储我们当前的相机旋转。我也想根据游戏的分辨率设置旋转速度:
MouseState currentMouseState;
Vector2 screenCenter;
float YrotationSpeed;
float XrotatiobSpeed;
float yaw = 0;
float pitch = 0;
...
protected override void LoadContent()
{
YrotationSpeed = (float)graphics.PreferredBackBufferWidth / 10000.0f;
XrotatiobSpeed = (float)graphics.PreferredBackBufferHeight / 12000.0f;
screenCenter = new Vector2(graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height) / 2;
}
现在,要计算鼠标在最后一帧中的移动量,我们将使用此功能:
private void HandleMouse(GameTime gameTime)
{
currentMouseState = Mouse.GetState();
float amount = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
if (currentMouseState.X != screenCenter.X)
{
yaw -= YrotationSpeed * (currentMouseState.X - screenCenter.X) * amount;
}
if (currentMouseState.Y != screenCenter.Y)
{
pitch -= XrotatiobSpeed * (currentMouseState.Y - screenCenter.Y) * amount;
if (pitch > MathHelper.ToRadians(90))
pitch = MathHelper.ToRadians(90);
if (pitch < MathHelper.ToRadians(-50)) //Preventing the user from looking all the way down (and seeing the character doesn't have any legs..)
pitch = MathHelper.ToRadians(-50);
}
Mouse.SetPosition((int)screenCenter.X, (int)screenCenter.Y);
}
最后:
要更新相机并查看Matrix,您可以使用以下功能,该功能应在我们更新偏航和俯仰后执行:
public void UpdateCamera(float yaw, float pitch, Vector3 position)
{
Matrix cameraRotation = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw);
Vector3 cameraOriginalTarget = new Vector3(0, 0, -1);
Vector3 cameraRotatedTarget = Vector3.Transform(cameraOriginalTarget, cameraRotation);
Vector3 cameraFinalTarget = position + cameraRotatedTarget;
Vector3 cameraOriginalUpVector = new Vector3(0, 1, 0);
Vector3 cameraRotatedUpVector = Vector3.Transform(cameraOriginalUpVector, cameraRotation);
view = Matrix.CreateLookAt(position, cameraFinalTarget, cameraRotatedUpVector);
}
编辑:好吧,当我重新阅读这个问题时,我意识到我的回答并不是你所要求的。尽管如此,它确实显示了如何计算鼠标增量而不会到达屏幕的边界。
为了符合我对你问题的回答,你所需要的只是微小的调整。
顺便说一下,除非你愿意在屏幕中间画一个鼠标的图像,否则任何有用的东西看起来都会有些迟钝。 因此,我强烈建议你隐藏光标。 为此,只需添加以下行:
this.IsMouseVisible = false;