Problema con allegro (marcianitos c++)

Iniciado por lluk, 15 Mayo 2011, 00:55 AM

0 Miembros y 1 Visitante están viendo este tema.

lluk

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



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;
}




ssaammuu

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

lluk

#2
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

ssaammuu

#3
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. :)

lluk

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?

ssaammuu

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.

:)