elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con allegro (marcianitos c++)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con allegro (marcianitos c++)  (Leído 4,070 veces)
lluk

Desconectado Desconectado

Mensajes: 106


C++Programming


Ver Perfil
Problema con allegro (marcianitos c++)
« 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



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




« Última modificación: 15 Mayo 2011, 14:18 pm por lluk » En línea

ssaammuu

Desconectado Desconectado

Mensajes: 35



Ver Perfil WWW
Re: Progrema con allegro (marcianitos c++)
« Respuesta #1 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


En línea

lluk

Desconectado Desconectado

Mensajes: 106


C++Programming


Ver Perfil
Re: Progrema con allegro (marcianitos c++)
« Respuesta #2 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
« Última modificación: 15 Mayo 2011, 19:13 pm por lluk » En línea

ssaammuu

Desconectado Desconectado

Mensajes: 35



Ver Perfil WWW
Re: Problema con allegro (marcianitos c++)
« Respuesta #3 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. :)
« Última modificación: 15 Mayo 2011, 21:11 pm por ssaammuu » En línea

lluk

Desconectado Desconectado

Mensajes: 106


C++Programming


Ver Perfil
Re: Problema con allegro (marcianitos c++)
« Respuesta #4 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?
En línea

ssaammuu

Desconectado Desconectado

Mensajes: 35



Ver Perfil WWW
Re: Problema con allegro (marcianitos c++)
« Respuesta #5 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.

:)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con un code de Allegro « 1 2 »
Programación C/C++
vojok 10 6,118 Último mensaje 25 Julio 2010, 18:55 pm
por vojok
problema vectores, allegro. « 1 2 3 »
Programación C/C++
MasterPunk 20 10,523 Último mensaje 14 Enero 2012, 02:32 am
por SirLanceCC
Problema con Juego en Allegro
Programación C/C++
SNP 0 1,552 Último mensaje 17 Junio 2013, 04:48 am
por SNP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines