Использование перенасыщения, чтобы мышь не покидала окно - PullRequest
2 голосов
/ 29 марта 2012

Я сейчас использую перенасыщение для игры и пытаюсь держать мышь внутри окна.Это не шутер от первого лица, так что запирать его по центру нехорошо.Я уже знаю о glutWarpPointer(int, int);, и я пробую вещи, которые работают (вроде).

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

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Это не совсем ответ на ваш вопрос, но это ответ на вашу проблему!

Почти в каждой игре есть свои курсоры.Они будут прятать мышь и рисовать курсор вручную там, где должна быть расположена мышь.

Если вы получите свое собственное изображение курсора и сделаете, как я сказал, вы можете просто нарисовать курсор на краю экрана,даже если положение мыши считывается за пределами границ.Затем вы можете перевернуть мышь обратно.

1 голос
/ 09 ноября 2018

Пытался найти и выяснить это, но не смог найти ответ, поэтому я реализовал это сам.Вот что сработало для моего фотоаппарата от первого лица:

обратный вызов от glutPassiveMotion

ОБРАЗЕЦ КОДА

void Game::passiveMouseMotion(int x, int y)
{

    //of my code for doing the cam, yours is may be different, this is based on the example from https://learnopengl.com/Getting-started/Camera
    if (firstMouse) {
    lastX = x;
    lastY = y;
    firstMouse = false;
    }

    float xoffset = x - lastX;
    float yoffset = lastY - y; // reversed since y-coordinates go from bottom to top

    lastX = x;
    lastY = y;

    camera->ProcessMouseMovement(xoffset, yoffset);

    glutPostRedisplay();

  //this is the main thing that keeps it from leaving the screen
    if ( x < 100 || x > win_w - 100 ) {  //you can use values other than 100 for the screen edges if you like, kind of seems to depend on your mouse sensitivity for what ends up working best
        lastX = win_w/2;   //centers the last known position, this way there isn't an odd jump with your cam as it resets
        lastY = win_h/2;   
        glutWarpPointer(win_w/2, win_h/2);  //centers the cursor
    } else if (y < 100 || y > win_h - 100) {
        lastX = win_w/2;
        lastY = win_h/2;
        glutWarpPointer(win_w/2, win_h/2);
    } 
}

Надеюсь, это поможет!

...