Обработка мыши для игры от первого лица в моногам - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь сделать игру от первого лица для 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, которые приводят к изменению времени между кадрами, что влияет на расстояние, которое мышь может перемещать за это время.

Я не знаю, является ли это причиной или моё предположение может даже вызвать это, но я хотел бы найти способ добиться последовательного движения мыши.

При необходимости могу предоставить видео проблемы.

Заранее спасибо.

1 Ответ

2 голосов
/ 23 апреля 2019

Мышь в 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();
}
...