saramgsilva Posted March 23, 2006 at 01:26 AM Report #19154 Posted March 23, 2006 at 01:26 AM boas, eu estou a iniciar em opengl...e SOS!!! 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: #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; } 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... www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
Solution brink@ero Posted March 23, 2006 at 02:27 PM Solution Report #19182 Posted March 23, 2006 at 02:27 PM Vendo o teu programa, tens erros alguns erros comum no início. Aconselho-te este livro muito bom: Computer Graphics Using OpenGL F.S.Hill, Jr Prentice Hall Já progamaste em VB?... isto é um pouco parecido com isso. Para começar a função: glutDisplayFunc(quadrado); Sempre e só quando a janela é aberta ou redimensionada a função quadrado é chamada! Por isso não faz sentido ter duas vezes a função nem um ciclo entre ela! a função glutMainLoop(); faz com que o programa entre num ciclo infinito. Outra coisa, eu vi que bombardiaste o programa com a instrução: glClearColor(1.0,1.0,1.0,0.0); Basta por uma vez, a não ser que queiras determinada altura mudar a cor de fundo. E por fim: glBegin(GL_QUADS); glBegin(GL_POLYGON); das duas uma, ou queres fazer um quadrado ou um poligono, por isso basta uma das instruções. O que queres é isto, mas como ves isto não é muito práctico, pois está num ciclo infinito numa função chamada pelo glutDisplayFunc, ou seja, não consegues fazer mais nada (nem encerrar nem minimizar nem fechar): #include <stdio.h> #include <GL/glut.h> #include <windows.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 quadrado(void){ do { 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(); Sleep(500); glClear(GL_COLOR_BUFFER_BIT); 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(); Sleep(500); }while(1); } 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); glutMainLoop(); return 0; }
saramgsilva Posted March 23, 2006 at 03:25 PM Author Report #19185 Posted March 23, 2006 at 03:25 PM eheh ja pisca!! 😄 fixe...Obrigada.... e mudei isso que falaste...eu sabia que nao estava mto bem...em relacao as cores eu keria k cada quadrado tivesse 1 cor diferenta....👍 fica aqui a alteracao... #include <stdio.h> #include <GL/glut.h> #include <windows.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 quadrado(void){ do { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(1.0,0.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(); Sleep(500); glClear(GL_COLOR_BUFFER_BIT); 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(); Sleep(500); }while(1); } 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); glutMainLoop(); return 0; } depois disto...tentei fazer algo que parasse o piscar...mas com a accao do teclado..primindo a tecla p ou P .... pq como o codigo anterior esta em ciclo infinito...quando fecho a janela...da erro... mas o codigo que fiz....nao mas nao funciona...onde esta o erro?? #include <stdio.h> #include <GL/glut.h> #include <windows.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 quadrado(void){ do { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(1.0,0.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(); Sleep(500); glClear(GL_COLOR_BUFFER_BIT); 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(); Sleep(500); }while(1); } void teclado (unsigned char key, int x, int y) { if( key==27) { exit (0); } if( key=='p' || key=='P') { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(1.0,0.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); glutKeyboardFunc(teclado); glutMainLoop(); return 0; } www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
TheDark Posted March 30, 2006 at 02:35 AM Report #20107 Posted March 30, 2006 at 02:35 AM Mais uma vez tarde e a más horas. Não sei se entretanto resolveste o problema, mas aqui fica uma solução. Percebo pouco de OpenGL, dei-lhe uns toques ha uns meses; felizmente, o problema é o algoritmo da função quadrado. Ao criares um loop infinito, a função nunca retorna, e assim sendo o glut não tem oportunidade de verificar se foi pressionada alguma tecla. Então, como dizer ao glut que queres desenhar quadrados num dado intervalo (no caso, de 1 em 1 segundo)? Para isso existe a função glutTimerFunc(), que recebe um valor em milissegundos, um apontador para uma função callback, e um valor para passar a essa função. Se disseres no final da função quadrado que dentro de 500 milissegundos a queres correr novamente, ficamos com uma espécie de loop não bloqueante: a função quadrado é chamada, desenha um quadrado, espera 500ms, desenha outro quadrado, e diz que quer ser chamada de novo daí a 500ms. Na prática não é bem assim, porque a função de callback da glutTimerFunc tem que receber um parametro do tipo int, e a função quadrado não recebe qualquer parâmetro; mas isso resolve-se facilmente indicando outra função de callback que se resume a chamar a função quadrado. Continuamos a chamar a função quadrado quando é preciso actualizar a janela; isso serve para desencadear esta "recursividade" falsa quando a janela é desenhada pela 1ª vez. Decerto haverá uma forma "menos padeira" :😁 de fazer isto, mas como disse pouco sei de OpenGL... Ficará então o código assim: #include <windows.h> #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 redesenha(int); void quadrado(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(1.0,0.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(); Sleep(500); glClear(GL_COLOR_BUFFER_BIT); 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(); glutTimerFunc(500, redesenha, NULL); } void teclado (unsigned char key, int x, int y) { if( key==27) exit (0); if( key=='p' || key=='P') { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(1.0,0.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(); } } void redesenha(int discard) { quadrado(); } 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); glutKeyboardFunc(teclado); glutMainLoop(); return 0; } Desaparecido.
brink@ero Posted March 30, 2006 at 09:07 AM Report #20114 Posted March 30, 2006 at 09:07 AM Sim existe e eu já respondi a tofas. //... void myIdle () { //... glutPostRedisplay(); } void main(int argc,char **argv) { //... glutIdleFunc (myIdle); //... } EDIT: Pronto, está ai. A função myIdle está sempre a executar, não precisa de nenhum ciclo infinito.
TheDark Posted March 30, 2006 at 03:12 PM Report #20150 Posted March 30, 2006 at 03:12 PM ah... obrigado por partilharem 😁 EDIT: ah... obrigado por partilharem 😛 é sempre bom sprender estas soluções mais correctas 🙂 Desaparecido.
saramgsilva Posted March 30, 2006 at 05:04 PM Author Report #20158 Posted March 30, 2006 at 05:04 PM Sim existe e eu já respondi a tofas. //... void myIdle () { //... glutPostRedisplay(); } void main(int argc,char **argv) { //... glutIdleFunc (myIdle); //... } EDIT: Pronto, está ai. A função myIdle está sempre a executar, não precisa de nenhum ciclo infinito. pois...estas 2 funcoes sao mto importantes...e mto uteis...eheh obrigada pela ajuda 😁 www.saramgsilva.com As minhas apps no WP7 Marketplace Youtube : Galinho - Windows Phone 7.5
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now