3 votes

Rafraîchissement de la scène gelé

Je rends la scène 2D (basée sur des tuiles) et j'enregistre les pressions sur les touches. Lorsque les touches fléchées sont enfoncées, je déplace la caméra. Bien que les pressions sur les touches soient enregistrées sans problème, ma scène ne se met pas à jour tant que je ne passe pas à une autre fenêtre et que je ne reviens pas en arrière. .

Pouvez-vous me donner un indice sur la cause du problème ?

PS. Je travaille sur Linux en développant OpenGL avec l'aide de surabondance ( freeglut ).

Ma fonction de rendu :

void render() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    if (s_map)
    for (int i = s_iCameraX; i < sc_iTilesY + s_iCameraY && i < s_map->usiHeight; i++)
    {
        for (int j = s_iCameraY; j < sc_iTilesX + s_iCameraX && j < s_map->usiWidth; j++)
        {
            short val = s_map->data[i][j];              
            if (val == 0x0010) glBindTexture(GL_TEXTURE_2D, texture[0]);
            else if (val == 0x0020) glBindTexture(GL_TEXTURE_2D, texture[1]);

            glBegin(GL_QUADS);
                glTexCoord2f(0.0f, 0.0f);   glVertex2f(j-s_iCameraX, i-s_iCameraY);
                glTexCoord2f(1.0f, 0.0f);   glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY);
                glTexCoord2f(1.0f, 1.0f);   glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY+1.0f);
                glTexCoord2f(0.0f, 1.0f);   glVertex2f(j-s_iCameraX, i-s_iCameraY+1.0f);
            glEnd();
        }
    }

glutSwapBuffers();
} 

Ma fonction spéciale de traitement des clés :

void keyproc(int key, int x, int y) {
    switch (key)
    {
    case GLUT_KEY_UP:
        printf("UP: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_iCameraY - 1 >= 0) s_iCameraY--;
        break;

    case GLUT_KEY_DOWN:
        printf("DOWN: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_map && s_iCameraY + 1 < s_map->usiHeight) s_iCameraY++;
        break;

    case GLUT_KEY_RIGHT:
        printf("RIGHT: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_map && s_iCameraX + 1 < s_map->usiWidth) s_iCameraX++;
        break;

    case GLUT_KEY_LEFT:
        printf("LEFT: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_iCameraX - 1 >= 0) s_iCameraX--;
        break;

    default: break;
    }
}

1voto

Synxis Points 5585

Ce qui suit pourrait valoir la peine d'être essayé : ajouter un rappel de mise en veille :

void idle(void)
{
    // Force GLUT to render the scene
    glutPostRedisplay();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X