OpenGL GLUT отменяет щелчок левой кнопкой мыши, удерживая правую кнопку мыши - PullRequest
0 голосов
/ 11 мая 2019

Я адаптирую некоторый скелетный код, чтобы узнать, как работает OpenGL, и в SphericalCameraManipulator.cpp, который позволяет мне поворачивать и наклонять камеру, удерживая правую кнопку мыши:

void SphericalCameraManipulator::handleMouseMotion(int x, int y)
{
    //Motion
    float xMotion = (float)x - previousMousePosition[0];
    float yMotion = (float)y - previousMousePosition[1];

    if(reset)
    {
        xMotion = yMotion = 0.0;
        reset = false;
    }

    this->previousMousePosition[0] = (float)x;
    this->previousMousePosition[1] = (float)y;

    //Right Button Action
    if(this->currentButton == GLUT_RIGHT_BUTTON && this->currentState == GLUT_DOWN)
    {
        this->pan  -= xMotion*this->panTiltMouseStep ;
        this->tilt += yMotion*this->panTiltMouseStep ;
    }

    //Enforce Ranges
    this->enforceRanges();
} 

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

//Left Button Action
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        ...   //game action
    }

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

Есть ли способ предотвратить это?Это прерывает ход игры.Я использую GLUT

1 Ответ

0 голосов
/ 12 мая 2019

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

Я написал небольшую функцию, которая просто записывала последнее состояние кнопки мыши 2 (кнопка «осмотр камеры»):

void SphericalCameraManipulator::handleMouse(int button, int state)
{
    this->currentButton = button;
    this->currentState  = state;

    //to enable mouse look around
    if (this->currentButton == 2) //right mouse
        this->lastLookState = this->currentState;

    if(this->currentState == GLUT_UP)
    {
        reset = true;
    }
}

Это означает, что даже когда текущее состояние касалось левой кнопки мыши (игровое действие), все еще можно было смотреть вокруг, так как событие «мыши на две кнопки вверх» не произошло:

this->currentButton = 2;
this->currentState  = 1;
...