Duvidas de Opengl e c/c++

tofas

Membro
boas,

eu estou a iniciar em opengl...e SOS!!!
wallbash.gif
wallbash.gif
wallbash.gif
wallbash.gif


e queria por uma imagem a piscar.... ou seja tenho 1 imagem 1 depois aparece a imagem 2 e depois a imagem 1 e assim sucessivamente....e fiz isto:

Código
GeSHi (c):
#include<stdio.h>
#include<GL/glut.h>


void init(void){

glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,500.0,0.0,500.0);

}


void quadrado1(void){

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor3f(1.0,0.0,0.0);
glVertex2i(30,30);
glVertex2i(30,60);
glVertex2i(60,60);
glVertex2i(60,30);


glEnd();

glFlush();

}

void quadrado2(void){

glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);

glBegin(GL_POLYGON);
glColor3f(1.0,1.0,0.0);
glVertex2f(125.0,125.0);
glVertex2f(375.5,125.0);
glVertex2f(375.0,375.0);
glVertex2f(125.0,375.0);

glEnd();

glFlush();

}


int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(quadrado);

do{
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(quadrado1);
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(quadrado2);

glutMainLoop();
}while(1);





return 0;
}Created by GeSHI 1.0.7.5

mas nao funciona...pois aparece spr o ultimo display...

devo estar a fazer asneiras...so pode...

ja agora a ideia inicial era por numa imagem....a dizer: conseguiste!! mas as letras a piscar...
 
Não entendo nada de GLUT, mas possivelmente o display é rápido demais para veres o primeiro objecto. Tenta colocar um temporizador para visualizar um e passado algum tempo o segundo quadrado.

Tens uma chamada a glBegin(GL_POLYGON); que não faz sentido em quadrado2().

O teu código em main() deveria estar mais limpo, algo tipo:

glutInit(&argc, argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB);

glutCreateWindow("piscar ganhou!! ");

init();

glutDisplayFunc(display);
glutIdleFunc(idle);

glutMainLoop();

onde o callback idle() seria um simples:

static void idle(void)
{
glutPostRedisplay();
}

e no callback display()

estarias a enviar para a grafica o codigo de desenho dos quadrados...
 
Tens de ter apenas uma função e registar com o glutDisplayFunc. Ou seja o main() apenas serve para registar funções. Nao podes ter um ciclo infinito no main(). Quando o ecran irá ser desenhado será chamada a função registada com o glutDisplayFunc.

O melhor é ter apenas um quadrado() nesse quadrado guardas uma variavel que diz qual a proxima côr que o quadrado irá ser desenhado.

Podes ter algo do genero:

typedef enum {
BRANCO,
VERMELHO
} Cor;

Cor cor = BRANCO;

quadrado() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);

if(cor == BRANCO) {
glColor3f(1.0,0.0,0.0);
cor = VERMELHO
} else {
glColor3f(1.0,1.0, .0);
cor = BRANCO
}
glVertex2i(30,30);
glVertex2i(30,60);
glVertex2i(60,60);
glVertex2i(60,30);
}


main() {
...
...
glutDisplayFunc(quadrado)
}
 
Back
Topo