Выбор примитивов при щелчке мышью не работает - PullRequest
2 голосов
/ 17 ноября 2010

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

У меня возникают проблемы с определением, в каком фрагменте была нажата мышь.

У меня есть следующий код для обратного вызова мыши:

GLuint selectBuf[BUFSIZE]; // BUFSIZE is defined to be 512
GLint hits;
GLint viewport[4];

if( ( state != GLUT_DOWN ) && ( button != GLUT_LEFT_BUTTON ) )
    return;

glGetIntegerv (GL_VIEWPORT, viewport);
glSelectBuffer (BUFSIZE, selectBuf);
(void) glRenderMode (GL_SELECT);
glInitNames();
glPushName(0);
gluPickMatrix ((GLdouble) x, (GLdouble) y, 20.0,20.0, viewport);

draw(GL_SELECT); // the function that does the rendering of the pieces

hits = glRenderMode(GL_RENDER);

processHits (hits, selectBuf); // a function that displays the hits obtained

Теперь у меня проблема в том, что я не совсем знаю, как обрабатывать возникшие попадания, которые находятся на selectBuf.У меня есть следующий код для processHits:

void processHits (GLint hits, GLuint buffer[])
{
    unsigned int i, j;
    GLuint ii, jj, names, *ptr;

    printf ("hits = %d\n", hits);
    ptr = (GLuint *) buffer;
    for(i = 0; i < hits; i++) {
        printf("hit n. %d ---> %d",i, *(buffer+i));
    }
}

Наконец, в функции draw у меня есть:

void draw(GLenum mode) {
    glClear (GL_COLOR_BUFFER_BIT);
    GLuint x,y;

    int corPeca; //colourpiece in english
    int corCasa; //colourHouse (each square has a diferent color, like checkers)
    for (x =0; x < colunas; x++) { //columns
        for(y=0; y < colunas; y++) {
            if ( (tabuleiro[y*colunas+x].peca) == 1) //board
                corPeca = 1;
            else
                corPeca = 2;

            if((tabuleiro[y*colunas+x].quadrado)==1) //square
                corCasa = 1;
            else
                corCasa = 2;

            if (mode == GL_SELECT){
                GLuint name = 4;
                glLoadName(name);
            }
            desenhaCasa(x,y,corCasa);       //draws square
            desenhaPeca(x,y,corPeca, mode); //draws piece
        }
    }
}

Теперь, вы можете видеть, я только что поставил 4в буфер с glLoadName.Однако когда я вытаскиваю число в processHits, я всегда получаю 1. Я знаю, что это из-за структуры буфера, который получает попадания, но какова эта структура и как я могу получить доступ к числу 4?

Большое спасибо за помощь.

1 Ответ

0 голосов
/ 17 ноября 2010

Структура буфера выбора немного сложнее. Для каждого попадания в буфер выбора добавляется «запись попадания», состоящая из нескольких значений. Вы можете посмотреть Вопрос 20.020 в FAQ по OpenGL для деталей. В вашем случае, когда в стеке одновременно присутствует только одно имя, запись попадания будет состоять из 4 значений, а имя будет четвертым. Итак, в вашей функции processHits вы должны написать

for(i = 0; i < hits; i++) {
    printf("hit n. %d ---> %d",i, *(buffer+4*i+3));
}

Кроме того, размер вашего буфера имен также должен быть в 4 раза больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...