在没有密钥释放的情况下调用glutKeyboardUpFunc

时间:2016-10-08 19:05:58

标签: c++ opengl glut

我遇到了glutKeyboardUpFunc的问题。每当我按下一个键并且不释放它时,将调用glutKeyboardUpFunc静止的回调,我按住键的时间越长,回调执行的次数就越多。

这是我提出的一个简单示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <GL/glut.h>


#define DEBUG 1

/* VARI�VEIS GLOBAIS */

typedef struct {
    GLboolean doubleBuffer;
    GLint delay;
} Estado;

typedef struct {
    GLfloat x;
    GLfloat y;
    GLfloat height;
    GLfloat width;
    GLfloat y_accelaration;
} Plataforma;


//save stage coordinates
typedef struct {
    GLfloat top;
    GLfloat bottom;
    GLfloat right;
    GLfloat left;
} Screen;

Estado estado;
Screen ecra;
Plataforma plataforma;


GLfloat tab_speed = 2.0 / 20.0;
GLfloat y_accelaration = 0.001;

void Init(void) {

    struct tm *current_time;
    time_t timer = time(0);

    estado.delay = 42;
    estado.doubleBuffer = GL_TRUE;

    plataforma.height = 0.3;
    plataforma.width = 0.05;

    plataforma.y_accelaration = 0;

    plataforma.y = 0;


    // L� hora do Sistema
    current_time = localtime(&timer);

    glClearColor(0.3, 0.3, 0.3, 0.0);

    glEnable(GL_POINT_SMOOTH);
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_POLYGON_SMOOTH);

}

void Reshape(int width, int height) {
    GLint size;
    GLfloat ratio = (GLfloat) width / height;
    GLfloat ratio1 = (GLfloat) height / width;

    if (width < height)
        size = width;
    else
        size = height;


    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    if (width < height) {
        ecra.left = -1;
        ecra.right = 1;
        ecra.bottom = -1 * ratio1;
        ecra.top = 1 * ratio1;
        gluOrtho2D(-1, 1, -1 * ratio1, 1 * ratio1);
    } else {
        ecra.left = -1 * ratio;
        ecra.right = 1 * ratio;
        ecra.bottom = -1;
        ecra.top = 1;
        gluOrtho2D(-1 * ratio, 1 * ratio, -1, 1);
    }

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void desenhar_plataforma(Plataforma pf) {
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_POLYGON);



    glVertex2f(pf.x - pf.width / 2, pf.y - pf.height / 2);
    glVertex2f(pf.x + pf.width / 2, pf.y - pf.height / 2);
    glVertex2f(pf.x + pf.width / 2, pf.y + pf.height / 2);
    glVertex2f(pf.x - pf.width / 2, pf.y + pf.height / 2);
    glEnd();
}


void Draw(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    plataforma.x = ecra.left + 0.1;
    desenhar_plataforma(plataforma);
    glFlush();
    if (estado.doubleBuffer)
        glutSwapBuffers();
}


void Key(unsigned char key, int x, int y) {
    switch (key) {

        case 'a':
            plataforma.y += tab_speed;
            glutPostRedisplay();
            break;
        case 's':
            plataforma.y -= tab_speed;
            glutPostRedisplay();
            break;
    }
}

void KeyUp(unsigned char key, int x, int y) {

    if (DEBUG)
        printf("Key Up %c\n", key);
}

int main(int argc, char **argv) {
    estado.doubleBuffer = GL_TRUE; 

    glutInit(&argc, argv);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(800, 600);
    glutInitDisplayMode(((estado.doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE) | GLUT_RGB);
    if (glutCreateWindow("No Man's Pong") == GL_FALSE)
        exit(1);

    Init();

    glutReshapeFunc(Reshape);
    glutDisplayFunc(Draw);

    // Callbacks de teclado
    glutKeyboardFunc(Key);
    glutKeyboardUpFunc(KeyUp);

    glutMainLoop();
    return 0;
}

这是按下&#39; a&#39;

时的输出
Key Up a             
Key Up a
Key Up a
Key Up a
Key Up a
Key Up a
Key Up a
......

不用说我不发布&#39; a&#39;。

我使用linux mint 17.3和g ++,关闭键重复或设置glutIgnoreKeyRepeat(true),停止了这个问题,但也使每次按键时只执行一次glutKeyboardFunc,我真的不想这样做。

有谁知道如何解决这个问题,或者是什么造成这种情况?

我还在Windows 8.1下编译了相同的代码,keyUp仅在实际密钥释放时触发。

0 个答案:

没有答案