Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lluk en 15 Mayo 2011, 00:55 am



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):

Código:
#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?
Código:
BITMAP *buffer = create_bitmap(500,500);

pongo el codigo de winbgim por si lo queréis ver:

Código:
#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
Código:
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.
Código:
//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:
Código:
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.

:)