SFML三维鼠标簿

本文关键字:三维鼠标 SFML | 更新日期: 2023-09-27 18:03:06

第2版:我解决了大部分问题,但有一点让我很烦恼。当光标到达屏幕边缘并被拉到另一侧时,相机会抖动,这将不起作用。有人能看到如何阻止这种情况吗?

    bool attention = true;
    Vector2 p, mousePos;
    private float MOUSE_SENSITIVITY = 4.0f;
    private void OnMouseMove(object sender, MouseMoveEventArgs e)
    {
        float DeltX = 0, DeltY = 0;
        int border = 2;
        Console.WriteLine(attention + "");
        if (attention == true)
        {
            p.X = e.X;
            p.Y = e.Y;
            DeltX = (float)(mousePos.X - e.X) / MOUSE_SENSITIVITY;
            DeltY = (float)(mousePos.Y - e.Y) / MOUSE_SENSITIVITY;
        }
        else
        {
            mousePos = p;
        }
        attention = true;
        if (e.X > App.Width - border)
        {
            attention = false;
            App.SetCursorPosition((uint)border, (uint)e.Y);
            DeltX = 0;
            DeltY = 0;
        }
        else if (e.X < border)
        {
            attention = false;
            App.SetCursorPosition((uint)(App.Width - border), (uint)e.Y);
            DeltX = 0;
            DeltY = 0;
        }
        if (e.Y > App.Height - border)
        {
            attention = false;
            App.SetCursorPosition((uint)e.X, (uint)border);
            DeltX = 0;
            DeltY = 0;
        }
        else if (e.Y < border)
        {
            attention = false;
            App.SetCursorPosition((uint)e.X, (uint)(App.Height - border));
            DeltX = 0;
            DeltY = 0;
        }

        Cam.RotateY(DeltX);
        Cam.RotateX(DeltY);

        mousePos = p;
    }

SFML三维鼠标簿

通常将鼠标位置设置为每帧窗口的中心。以前您读取到鼠标位置并减去窗口的中心。通过这种方式,您可以轻松地在每帧中移动鼠标,而不必担心窗口边界。

Vector2i center(window->getSize().x / 2, window->getSize().y / 2);
Vector2i delta = Mouse::getPosition(*window) - center;
Mouse::setPosition(center, *window);

我仍在加快速度,所以请对此持谨慎态度。(我在尝试!(

我认为你的鼠标移动是用像素来衡量的;这转化为相机的完整旋转。除以0.4,(MOUSE_MOVEMENT,(会影响"0.4整转"的倍数(例如152像素/.04=380转,使您面向与中开始时相同的方向。(

尝试除以256而不是0.4&看看效果是否更好。