Test Foro de elhacker.net SMF 2.1

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


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

:)