Título: Problema con allegro (marcianitos c++)
Publicado por: lluk en 15 Mayo 2011, 00:55 am
Hola, estoy haciendo el juego de los marcianitos en c++ utilizando la librería allegro lo que pasa es que cuando compilo me sale este error (http://imageshack.us/m/850/1264/sinttulopj.jpg) El caso es que el programa estaba hecho en winbgim (para el instituto) pero ahora queria poner mas cosas y con esta librería me quedaba corto asi que lo pase a allegro el code de allegro es este (falta por acabar la parte de los ifs del main): #include <allegro.h> #include <stdio.h>
void init(); void deinit();
BITMAP *buffer = create_bitmap(640,480); int vectorm[3][5]; int punts,tocat=1; int e[5]; int f[3]; int g[5]; int h[3];
void nau(int a,int b,int c,int d) { rectfill(buffer,a,b,c,d,4); rectfill(buffer,a+25,b-10,c-25,d,4); rectfill(buffer,a+30,b-15,c-30,d,4); } void bnau(int a,int b,int c,int d) { rectfill(buffer,a,b,c,d,0); rectfill(buffer,a+25,b-10,c-25,d,0); rectfill(buffer,a+30,b-15,c-30,d,0); }
void bmarciano(int m,int z) { rectfill(buffer,e[z],f[m],g[z],h[m],0); rectfill(buffer,e[z]-5,f[m],g[z]-40,h[m]+5,0); rectfill(buffer,e[z]+40,f[m],g[z]-5,h[m]+5,0); }
void dibuixar() { int c,r; for(c=0;c<3;c++) { for(r=0;r<5;r++) { if(vectorm[c][r]==0) { rectfill(buffer,e[r],f[c],g[r],h[c],10); rectfill(buffer,e[r]-5,f[c],g[r]-40,h[c]+5,10); rectfill(buffer,e[r]+40,f[c],g[r]-5,h[c]+5,10); rectfill(buffer,e[r]+5,f[c]+5,g[r]-30,h[c]-12,0); rectfill(buffer,e[r]+25,f[c]+5,g[r]-10,h[c]-12,0); } } } }
void disparar(int x,int y,int a,int b,int c,int d) { int z; int m; int salt=0; while(y>-5) { circlefill(buffer,x,y,3,15); circlefill(buffer,x,y,3,0); y=y-1; for(m=0;m<3;m++) { if(y>=f[m] && y<=h[m]) { for(z=0;z<5;z++) { if(x>=e[z] && x<=g[z]) { if(vectorm[m][z]==0) { punts++; printf("Tens %d punts\n",punts); vectorm[m][z]=1; bmarciano(m,z); //cleardevice(); nau(a,b,c,d); dibuixar(); salt=1; } } if(salt) break; } } if(salt) break; } if(salt) break; } if(punts>14) { printf("FI DEL JOC"); // outtextxy(200,200,"FI DEL JOC"); exit(1); } }
void ini_e_g() { int i; for (i=1;i<5;i++) { e[i]=e[i-1]+90; g[i]=g[i-1]+90; } }
void ini_f_h() { int x; for(x=1;x<3;++x) { f[x]=f[x-1]+60; h[x]=h[x-1]+60; } }
void ini_vectorm() { int x,h; for(x=0;x<3;++x) { for(h=0;h<5;++h) { vectorm[x][h]=0; } } }
int main() { init(); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 500,500,0,0);
int a=100; //barres de la nau int b=450; int c=170; int d=470;
e[0]=40; //barres del marciano f[0]=20; g[0]=80; h[0]=40;
ini_e_g(); ini_f_h(); ini_vectorm();
int x; int y;
punts=0;
while (!key[KEY_ESC]) { if(key[KEY_LEFT]); if(key[KEY_RIGHT]); if(key[KEY_SPACE]);
blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); }
deinit(); return 0; } END_OF_MAIN()
void init() { allegro_init(); install_keyboard(); install_timer(); /* add other initializations here */ }
void deinit() { clear_keybuf(); /* add other deinitializations here */ }
Supongo que el error esta en la incialización pero nose alomejor en esta linea? BITMAP *buffer = create_bitmap(500,500);
pongo el codigo de winbgim por si lo queréis ver: #include <winbgim.h> #include <stdio.h> #include <conio.h> #include <vector>
#define KEY_UP 72 #define KEY_LEFT 75 #define KEY_RIGHT 77 #define KEY_DOWN 80 #define KEY_ESC 27
int vectorm[3][5]; int punts,tocat=1; int e[5]; int f[3]; int g[5]; int h[3];
void nau(int a,int b,int c,int d) { setcolor(10); setfillstyle(1,4); bar3d(a,b,c,d,0,0); bar3d(a+25,b-10,c-25,d,0,0); bar3d(a+30,b-15,c-30,d,0,0); } void bnau(int a,int b,int c,int d) { setcolor(0); bar3d(a,b,c,d,0,0); bar3d(a+25,b-10,c-25,d,0,0); bar3d(a+30,b-15,c-30,d,0,0); } void bmarciano(int m,int z) { setcolor(0); bar3d(e[z],f[m],g[z],h[m],0,0); bar3d(e[z]-5,f[m],g[z]-40,h[m]+5,0,0); bar3d(e[z]+40,f[m],g[z]-5,h[m]+5,0,0); }
void dibuixar() { int c,r; for(c=0;c<3;c++) { for(r=0;r<5;r++) { if(vectorm[c][r]==0) { setcolor(4); setfillstyle(1,10); bar3d(e[r],f[c],g[r],h[c],0,0); bar3d(e[r]-5,f[c],g[r]-40,h[c]+5,0,0); bar3d(e[r]+40,f[c],g[r]-5,h[c]+5,0,0); setfillstyle(1,0); bar3d(e[r]+5,f[c]+5,g[r]-30,h[c]-12,0,0); bar3d(e[r]+25,f[c]+5,g[r]-10,h[c]-12,0,0); } } } }
void disparar(int x,int y,int a,int b,int c,int d) { int z; int m; int salt=0; while(y>-5) { setcolor(15); fillellipse(x,y,3,3); setcolor(0); fillellipse(x,y,3,3); y=y-1; for(m=0;m<3;m++) { if(y>=f[m] && y<=h[m]) { for(z=0;z<5;z++) { if(x>=e[z] && x<=g[z]) { if(vectorm[m][z]==0) { punts++; printf("Tens %d punts\n",punts); vectorm[m][z]=1; bmarciano(m,z); cleardevice(); nau(a,b,c,d); dibuixar(); salt=1; } } if(salt) break; } } if(salt) break; } if(salt) break; } if(punts>14) { printf("FI DEL JOC"); outtextxy(200,200,"FI DEL JOC"); exit(1); } }
void ini_e_g() { int i; for (i=1;i<5;i++) { e[i]=e[i-1]+90; g[i]=g[i-1]+90; } } void ini_f_h() { int x; for(x=1;x<3;++x) { f[x]=f[x-1]+60; h[x]=h[x-1]+60; } } void ini_vectorm() { int x,h; for(x=0;x<3;++x) { for(h=0;h<5;++h) { vectorm[x][h]=0; } } }
int main() { initwindow(500,500);
int a=100; //barres de la nau int b=450; int c=170; int d=470; e[0]=40; //barres del marciano f[0]=20; g[0]=80; h[0]=40; ini_e_g(); ini_f_h(); int x; //coordenades del disparo int y; punts=0; //contador de punts ini_vectorm(); char k; nau(a,b,c,d); dibuixar(); while(k!=KEY_ESC) { if(kbhit()) { k=(char)getch(); switch (k) { case KEY_RIGHT: if(c>499); else { bnau(a,b,c,d); a=a+1; c=c+1; bnau(a,b,c,d); a=a+1; c=c+1; nau(a,b,c,d); bnau(a,b,c,d); a=a+1; c=c+1; bnau(a,b,c,d); a=a+1; c=c+1; nau(a,b,c,d); } break; case KEY_LEFT: if(a<1); else { bnau(a,b,c,d); a=a-1; c=c-1; bnau(a,b,c,d); a=a-1; c=c-1; nau(a,b,c,d); bnau(a,b,c,d); a=a-1; c=c-1; bnau(a,b,c,d); a=a-1; c=c-1; nau(a,b,c,d); } break; case KEY_UP: x=a+35; y=d-38; disparar(x,y,a,b,c,d); break; } } } outtextxy(200,200,"Fi del Joc"); getchar(); getchar(); closegraph(); //close graphics window return 0; }
Título: Re: Progrema con allegro (marcianitos c++)
Publicado por: ssaammuu en 15 Mayo 2011, 12:36 pm
No he leido el código entero pero efectivamente la siguiente línea da error BITMAP *buffer = create_bitmap(640,480); Esto debe ir después de iniciar allegro. Pudes dejar la declaración de buffer allí arriba, pero crear el bitmap no puedes hasta que hagas la llamada allegro_init(); :D
Título: Re: Progrema con allegro (marcianitos c++)
Publicado por: lluk en 15 Mayo 2011, 14:12 pm
entonces como lo tendría que solucionar? porque el valor de los punteros se tiene que declarar a la vez que lo inicializas y no me deja pasarlo como parámetro en las funciones. :S
ya lo solucioné ahora tengo otro error que es que cuando muevo la barra me va rapidísimo i casi que no tengo tiempo de ver como se mueve, si lo pongo que se mueva 0.1 pixeles cada vez igualmente me va muy rápido
Título: Re: Problema con allegro (marcianitos c++)
Publicado por: ssaammuu en 15 Mayo 2011, 21:08 pm
Por lo que veo, tu juego no tiene ninguna forma de controlar el tiempo. La velocidad a la que se mueve la barra (y todo lo demas) es proporcional a la velocidad de la máquina donde se corre el programa. Te recomiendo que rectifiques esto. La opción más fácil y que necesita menos cambios en tu código, es "castrar" la velocidad a un FPS fijo, por ejemplo 50 (50 iteraciones por segundo). Esto lo puedes implementar así de fácil. //codigo...
//funcion FPS constante #define FPS 30 //o la que quieras bool proceder = false; void tiempoTranscurrido() { proceder=true; }
int main() { //init tus cosas... install_timer();
LOCK_VARIABLE(proceder); LOCK_FUNCTION(tiempoTranscurrido); install_int_ex(tiempoTranscurrido, BPS_TO_TIMER(FPS));
//tus cosas...
//bucle principal while (!key[KEY_ESC]) { if(proceder){ proceder=false;
//aqui lo que va dentro del bucle principal
} }
//el resto del codigo...
Esto lo que hace es que cada 1/FPS segundos, la función tiempoTranscurrido se ejecute, haciendo proceder=true. Esto nos permite ejecutar el código dentro de if(proceder), es decir el bucle principal, donde igualamos proceder a false, para que no se ejecute otra vez hasta (1/FPS) segundos más tarde. Así tienes una velocidad de juego constante y por ejemplo si tienes x++ dentro de la lógica, sabrás que la posición un segundo más tarde será 30 pixeles a la derecha con un FPS de 30 por lo que te dá mejor manejo. Espero que esto te ayude. :)
Título: Re: Problema con allegro (marcianitos c++)
Publicado por: lluk en 15 Mayo 2011, 21:35 pm
la verdad es que me ha ido muy bien :D gracias las funciones LOCK_FUNCTION i LOCK_VARIABLE sirven para que no se puedan modificar?
otra duda más :p los marcianos como los tendria que hacer mover?
Título: Re: Problema con allegro (marcianitos c++)
Publicado por: ssaammuu en 15 Mayo 2011, 23:23 pm
Esas dos funciones en rara ocasión son útiles así que pudes borrarlas, es más en la versión 5 de allegro creo que ya no existen. xD Su movimiento depende de lo que intentes hacer. Se van a mover horizontalmente? verticalmente? movimiento complejo según la posición del jugador? Tendrás que definir los patrones de movimiento que quieres y después implementarlos con funciones matemáticas. Por lo que veo, el código está bastante mal organizado. Si estás usando C++ usa clases!! Podrías tener una clase que cree y manipule los marcianos como por ejemplo esta: class cMarciano{ public: ~cMarciano(); void disparar(); static void anadirMarciano(float x, float y); static void moverMarcianos(); static vector<cMarciano*> marcianitos; private: cMarciano(); float x, y; };
Donde el constructor es privado para no poderlo llamar directamente. La funcion anadirMarcianos crearia un nuevo marciano y lo añadiría al vector. La función moverMarcianos iteraría el vector moviendo todos los marcianos. A parte le puedes añadir cualquier funcionalidad que veas oportuna. No hay UNA manera de hacerlo, todo depende de lo que tú prefieras y con lo que mejor te manejes. Pero igualmente usa clases que van a hacer tu código más limpo, mejor estructurado y menos confuso. :)
|