Dudas con Allegro

Si tienes alguna duda y crees que alguien podría resolverla, ponla aquí. || If you have any doubt about programming, post it here.

Moderador: CEZ

Responder
Floc
8 bits
8 bits
Mensajes: 9
Registrado: 16 Jun 2007 14:22

Dudas con Allegro

Mensaje por Floc »

Hace poco que me he metido en esto de la programación, y ahora estoy trasteando con la librería Allegro, con Dev++ para mas señas.

Hay tutoriales por internet, pero no los entiendo!! Son un montón de lineas con unas descripciones con términos que desconozco y no entiendo donde y como tengo que poner el código.

Ahora estaba intentando aprender a usar sprites. Si alguien me pudiera echar un cable se lo agradecería mucho. Si fuese con un ejemplo sencillito, como hacer que un spirte se situara en mitad de la pantalla, pues mejor.

El juego que he hecho con Allegro es el típico Snake de los móviles. No sé porque aveces se bloquea el control, si alguien pudiera echarle un vistazo, que me lo diga y se lo paso.

salu2
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensaje por Benway »

Usas lo mismo que yo... aunque cada vez uso más KDevelop (bajo linux) que DevCPP, pero para programar para Windows, es la IDE que uso.

Y Allegro, mi librería gráfica preferida ;)

En Allegro, los sprites son bitmaps. La diferencia es que siempre se dibujan con la "máscara", es decir, que los píxeles de color "transparente" (magenta FF,0,FF) no se pintarán, pero, para todo lo demás, son bitmaps como cualquier otro.

Otra cosa son los sprites compilados y los sprites RLE: Es lo mismo, pero primero tienes que "convertir" el bitmap a ese tipo de datos.

Te pongo el ejemplo que pides:

Código: Seleccionar todo

#include <allegro>

void init();
void deinit();

int main() {
	init();      // Inicializamos
	
	BITMAP* Sprite;      // Vamos a usar un BITMAP que vamos a llamar Sprite
	Sprite = create_bitmap (24, 24);      // Creamos ese bitmap: 24 píxeles de ancho y 24 de alto
	clear_to_color (Sprite, makecol (255,255,0));      // Lo llenamos de color amarillo
    draw_sprite (screen, Sprite, ((screen->w) / 2) - ((Sprite->w) / 2), ((screen->h) / 2) - ((Sprite->h) / 2));     // Lo ponemos en el centro de la pantalla: Hay que poner la esquina superior izquierda en el punto que resulta de, al centro de la pantalla, ir hacia arriba y hacia la izquierda la mitad de la dimensión del sprite

	while (!key[KEY_ESC]) {
	}     // Esperamos a que pulse ESC

	destroy_bitmap (Sprite);      // Devolvemos la memoria que cogimos para el bitmap

	deinit();    // De-inicilizamos
	return 0;
}
END_OF_MAIN()

void init() {
	int depth, res;
	allegro_init();
	depth = desktop_color_depth();
	if (depth == 0) depth = 32;
	set_color_depth(depth);
	res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
	if (res != 0) {
		allegro_message(allegro_error);
		exit(-1);
	}

	install_timer();
	install_keyboard();
	install_mouse();
	/* add other initializations here */
}

void deinit() {
	clear_keybuf();
	/* add other deinitializations here */
}
Ya ves que no tiene nada del otro jueves. Seguro que lo podrías haber hecho tú ;)

Te adjunto un documento que me fue útil en su momento: Una especie de "Introducción a Allegro" en Castellano,muy sencilla (y un poco anticuada, las funciones de texto han cambiado), pero que es muy buena como toma de contacto.

Ah! Y te pongo la URL de la Doc de Allegro en castellano: http://es.tldp.org/Allegro-es/web/ También está "anticuada" con respecto a la inglesa, pero a veces ayuda a entender mejor las cosas... por lo menos a los que el inglés se nos da "sólo regular" :P

Con respecto al código de tu programa... cuélgalo por aquí, que le echemos un vistazo, a ver si te podemos ayudar.

Un saludo
No tienes los permisos requeridos para ver los archivos adjuntos a este mensaje.
Un saludo.
Imagen - Imagen - Imagen
Floc
8 bits
8 bits
Mensajes: 9
Registrado: 16 Jun 2007 14:22

Mensaje por Floc »

Muchas gracias! :D

Veré que puedo hacer con esto. El problema es que cuando lo veo en tutoriales, muchas veces no ponen ejemplos y ponen las funciones con los parámetros, a lo álgebra. Y no se que se debe substituir, que no, y por que.

Para cargar un sprite hecho, con el paint por ejemplo, como se haria?

ahí va el código del snake. Es bastante chapucillas
:oops:


PD Hay un archivo de música, creo que si no tienes el mismo no funciona, no? Usar otro midi para ver si chuta.

Código: Seleccionar todo

#include<allegro>
#include <time>

//#include <stdlib>



int i,j,x,y,puntos=0,kol=0,k=0,q=0, vidas=1, //Contadores varios
x1=0,W=1,y1=0,Z=0, //Controladores de coordenadas serpiente
sai=4, // Distancia de la serpiente
Xo=0,Yo=0,//Coordenadas objetivp
presa=0,//Indica el estado de la presa, 0=no existe, 1=existe
menseki[30][30], // Tablero de juego
taimu=500,retardo,// Contador de juego y retardo de serpiente
velocidad=1000,// Varia la velocidad de la serpiente, se controla del 1 al 4 del pad   INHABILITADO!!
c1=rand()%250,c2=rand()%250,c3=rand()%250,
controlador=0; 


                    


int mostrar_menseki()//Muestra el tablero
{
 
    
    for(i=0,x=10;i<30;i++,x++)
    {
        x=x+11;
             for(j=0,y=10;j<30>0)//Serpiente
                         {
                         rectfill(screen,x+170,y+40,x+180,y+50, c3);
                         menseki[i][j]--;
                         circlefill(screen,x+175,y+45,5, c1);
                         circlefill(screen,x+175,y+45,4, c2);
                         circlefill(screen,x+175,y+45,3, c3);
                         }
                         
                         if(menseki[i][j]==-10)//Objetivo
                         //rectfill(screen,x+170,y+40,x+180,y+50, 50);
                         circlefill(screen,x+175,y+45,5, c2);
                         
                         
                         textprintf_ex(screen,font,40,50,makecol(100,0,0),875,"presa %d",menseki[20][15]);
                         
                         textprintf_ex(screen,font,40,70,makecol(100,0,0),875,"%d Puntos ",puntos);
                         
                         textprintf_ex(screen,font,40,170,makecol(100,50,0),875,"Tiempo %d",taimu);
                         
                         textprintf_ex(screen,font,40,90,makecol(0,0,0),875,"Xs %d",x1);
                         
                         textprintf_ex(screen,font,40,110,makecol(0,0,0),875,"Ys %d",y1);
                         
                         textprintf_ex(screen,font,40,130,makecol(100,0,25),875,"X %d",Xo);
                         
                         textprintf_ex(screen,font,40,150,makecol(100,50,0),875,"Y %d",Yo);
                        
                         textprintf_ex(screen,font,40,200,makecol(100,0,0),875,"%d Nivel ",sai-4);
                        
                                    
                                      
                     }
    }
                                      

}

////////////////////////////////////////////////////////////////////////////////

int limpiar_menseki() //Limpia el tablero por primera vez de residuos
{
 
      for(x=0;x<30;x++)
      {
       
       for(y=0;y<30;y++)
           
           menseki[x][y]=0;
           
                    
       }
       
        rectfill(screen,30,30,170,450, 27); //26
        rectfill(screen,180,30,560,450, 47);
        
        
        textprintf_ex(screen,font,200,40,makecol(0,0,0),875,"-SNAKE 0.5 Beta-");
        textprintf_ex(screen,font,40,420,makecol(0,0,0),875,"ESC para salir");
        textprintf_ex(screen,font,40,90,makecol(0,0,0),875,"Xs %d",x1);
        textprintf_ex(screen,font,40,110,makecol(0,0,0),875,"Ys %d",y1);
        textprintf_ex(screen,font,40,130,makecol(100,0,25),875,"X %d",Xo);
        textprintf_ex(screen,font,40,150,makecol(100,50,0),875,"Y %d",Yo);
        
        
        
        
        
       
}

////////////////////////////////////////////////////////////////////////////////

int hebi() //Modifica la serpiente
{
 
    
    if((menseki[Xo][Yo]==menseki[x1][y1])&&(presa==1))
    {
    sai++;
    puntos++;
    menseki[x1][y1]=0;
    presa=0;
    taimu=500;
    }
    
    
    
    
   menseki[x1][y1]=sai;
   
      
   
   
   
    
    
    if((key[KEY_RIGHT])&&(menseki[x1+1][y1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {               
     W=1;     
     Z=0;
     //x1=x1+W;
     //y1=y1+Z;
    }
    
     if((key[KEY_LEFT])&&(menseki[x1-1][y1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {                
     W=-1;
     Z=0;
    //x1=x1+W; MANUAK
    // y1=y1+Z;
    }
    
     if((key[KEY_UP])&&(menseki[x1][y1-1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {                  
     W=0;
     Z=-1;
     //  x1=x1+W; MANUAL
     //y1=y1+Z;
    }
    
     if((key[KEY_DOWN])&&(menseki[x1][y1+1]<0>=0)&&(x1<30>=0)&&(y1<30>0)
        vidas=0;
        
        
        
        
        
    //if((menseki[x1][y1]>0)&&(menseki[x1][y1]!=sai))
    //vidas=0;
    
   
    
 
     
    /////////////////////// MODO SIN PAREDES  
    if(x1>30)
    x1=0;
    
    if(x1<0>30)
    y1=0;
    
    if(y1<0>30)
    vidas=0;
    
    if(x1<0>31)
    vidas=0;
    
    if(y1<0)
    vidas=0;
   */ //////////////////////////////
    
    
    
    menseki[x1][y1]=1;
  /*  
    if(key[KEY_1_PAD])
    velocidad=1000;
    
    if(key[KEY_2_PAD])
    velocidad=1500;
    
    if(key[KEY_3_PAD])
    velocidad=2000;
    
    if(key[KEY_4_PAD])
    velocidad=9000;
  */  

 
  if(puntos==kol+10)
  {
                    kol=kol+10;
                    c1=rand()%250;
                    c2=rand()%250;
                    c3=rand()%250;
                    
                    
  }
  
  /*///////////////// Serp multicolor juajuajua
                
  color1=color1+puntos*;
  color2=color1*puntos-x1;
  color3=color1+puntos+y1;
  
                
                
 /*/////////////////
 
    for(retardo=0;retardo<10000000>0)&&(vidas>0))
{

taimu--;

objetivo();
hebi();

mostrar_menseki();


if(key[KEY_ESC])
   taimu=0;

}
}

////////////////////////////////////////////////////////////////////////////////

int menu_principal()
{
    while(k=1)
    {
   rectfill(screen,10,10,630,470, 25);
 
   for(q=10000000;q>0;q--)
   rectfill(screen,160,80,500,270, 80);
   
   
   
   for(q=10000000;q>0;q--)
   {
   textprintf_ex(screen,font,200,100,makecol(100,50,0),875,"--SNAKE 0.5 Beta--\n Pulsa ENTER para empezar");
   if(key[KEY_ENTER])
   q=0;
   }
    
   
   
   if(key[KEY_ENTER])
   k=0;
   }
   
   rectfill(screen,10,10,630,470, 25);
    
    
}




int inicializar_programa()
{
allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT,640,480,0,0);
set_palette(desktop_palette);
clear_to_color(screen,makecol(250,250,250));
acquire_screen();
srand(time(NULL));
}


/////////////////////////////////////////////////////////////////////////////////


 
 
 void inicializa_allegro_music()
 {
  
   int driver1,driver2;
   detect_digi_driver(driver1);
   detect_midi_driver(driver2);
   reserve_voices(5,5);
   install_sound(driver1,driver2,"cfg_path");
   set_volume(150,100);
}
   
void poner_musica(MIDI *musica)
{
     play_midi(musica,1);

}

int play_music()
{
    MIDI *musica;
    inicializa_allegro_music();
    musica=load_midi("choco.mid");
    poner_musica(musica);
    
    while((!key[KEY_ESC])&&(controlador=1))
    {
      juego();
               
    rest(10);
    }
    
    destroy_midi(musica);
    
    
    return 0;



}
//////////////////////////////////////////////////////////////////////////////////






void main(void)
{
     

     
inicializar_programa();
play_music();

//menu_principal();
//juego();
limpiar_menseki();
mostrar_menseki();
textprintf_ex(screen,font,200,350,makecol(100,0,25),875,"Pulsa cualquier tecla para salir");
               

readkey();

 




}
END_OF_MAIN()
Floc
8 bits
8 bits
Mensajes: 9
Registrado: 16 Jun 2007 14:22

Mensaje por Floc »

Ups, se te olvido el ".h" en el include.
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensaje por Benway »

Ok... a ver si le puedo echar un ojo... ando fatal de tiempo... así que no te me impacientes (además, mañana me voy de vacaciones 1 semana) ... pero seguro que alguno de los cracks que por aquí circulan se me adelantan ;)
Un saludo.
Imagen - Imagen - Imagen
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensaje por Benway »

De entrada, esto no tiene sentido:

Código: Seleccionar todo

             for(j=0,y=10;j<30>0)//Serpiente
Como éste, tienes más errores de sintaxis, te sobra una } por ahí, te faltan paréntesis en un par de sitios, llamas a funciones no definidas: objetivo() y juego() ...

¿No tienes por ahí la versión "buena"? La que has compilado y te falla ;)
Un saludo.
Imagen - Imagen - Imagen
Floc
8 bits
8 bits
Mensajes: 9
Registrado: 16 Jun 2007 14:22

Mensaje por Floc »

¿¿¿???

No entiendo, este codigo no encaja con el mio. En parte si. quizás hubo un error al copiarlo?

Código: Seleccionar todo

#include<allegro>
#include <time>

//#include <stdlib>



int i,j,x,y,puntos=0,kol=0,k=0,q=0, vidas=1, //Contadores varios
x1=0,W=1,y1=0,Z=0, //Controladores de coordenadas serpiente
sai=4, // Distancia de la serpiente
Xo=0,Yo=0,//Coordenadas objetivp
presa=0,//Indica el estado de la presa, 0=no existe, 1=existe
menseki[30][30], // Tablero de juego
taimu=500,retardo,// Contador de juego y retardo de serpiente
velocidad=1000,// Varia la velocidad de la serpiente, se controla del 1 al 4 del pad   INHABILITADO!!
c1=rand()%250,c2=rand()%250,c3=rand()%250,
controlador=0; 


                    


int mostrar_menseki()//Muestra el tablero
{
 
    
    for(i=0,x=10;i<30;i++,x++)
    {
        x=x+11;
             for(j=0,y=10;j<30>0)//Serpiente
                         {
                         rectfill(screen,x+170,y+40,x+180,y+50, c3);
                         menseki[i][j]--;
                         circlefill(screen,x+175,y+45,5, c1);
                         circlefill(screen,x+175,y+45,4, c2);
                         circlefill(screen,x+175,y+45,3, c3);
                         }
                         
                         if(menseki[i][j]==-10)//Objetivo
                         //rectfill(screen,x+170,y+40,x+180,y+50, 50);
                         circlefill(screen,x+175,y+45,5, c2);
                         
                         
                         textprintf_ex(screen,font,40,50,makecol(100,0,0),875,"presa %d",menseki[20][15]);
                         
                         textprintf_ex(screen,font,40,70,makecol(100,0,0),875,"%d Puntos ",puntos);
                         
                         textprintf_ex(screen,font,40,170,makecol(100,50,0),875,"Tiempo %d",taimu);
                         
                         textprintf_ex(screen,font,40,90,makecol(0,0,0),875,"Xs %d",x1);
                         
                         textprintf_ex(screen,font,40,110,makecol(0,0,0),875,"Ys %d",y1);
                         
                         textprintf_ex(screen,font,40,130,makecol(100,0,25),875,"X %d",Xo);
                         
                         textprintf_ex(screen,font,40,150,makecol(100,50,0),875,"Y %d",Yo);
                        
                         textprintf_ex(screen,font,40,200,makecol(100,0,0),875,"%d Nivel ",sai-4);
                        
                                    
                                      
                     }
    }
                                      

}

////////////////////////////////////////////////////////////////////////////////

int limpiar_menseki() //Limpia el tablero por primera vez de residuos
{
 
      for(x=0;x<30;x++)
      {
       
       for(y=0;y<30;y++)
           
           menseki[x][y]=0;
           
                    
       }
       
        rectfill(screen,30,30,170,450, 27); //26
        rectfill(screen,180,30,560,450, 47);
        
        
        textprintf_ex(screen,font,200,40,makecol(0,0,0),875,"-SNAKE 0.5 Beta-");
        textprintf_ex(screen,font,40,420,makecol(0,0,0),875,"ESC para salir");
        textprintf_ex(screen,font,40,90,makecol(0,0,0),875,"Xs %d",x1);
        textprintf_ex(screen,font,40,110,makecol(0,0,0),875,"Ys %d",y1);
        textprintf_ex(screen,font,40,130,makecol(100,0,25),875,"X %d",Xo);
        textprintf_ex(screen,font,40,150,makecol(100,50,0),875,"Y %d",Yo);
        
        
        
        
        
       
}

////////////////////////////////////////////////////////////////////////////////

int hebi() //Modifica la serpiente
{
 
    
    if((menseki[Xo][Yo]==menseki[x1][y1])&&(presa==1))
    {
    sai++;
    puntos++;
    menseki[x1][y1]=0;
    presa=0;
    taimu=500;
    }
    
    
    
    
   menseki[x1][y1]=sai;
   
      
   
   
   
    
    
    if((key[KEY_RIGHT])&&(menseki[x1+1][y1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {               
     W=1;     
     Z=0;
     //x1=x1+W;
     //y1=y1+Z;
    }
    
     if((key[KEY_LEFT])&&(menseki[x1-1][y1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {                
     W=-1;
     Z=0;
    //x1=x1+W; MANUAK
    // y1=y1+Z;
    }
    
     if((key[KEY_UP])&&(menseki[x1][y1-1]<0>=0)&&(x1<30>=0)&&(y1<=30))
    {                  
     W=0;
     Z=-1;
     //  x1=x1+W; MANUAL
     //y1=y1+Z;
    }
    
     if((key[KEY_DOWN])&&(menseki[x1][y1+1]<0>=0)&&(x1<30>=0)&&(y1<30>0)
        vidas=0;
        
        
        
        
        
    //if((menseki[x1][y1]>0)&&(menseki[x1][y1]!=sai))
    //vidas=0;
    
   
    
 
     
    /////////////////////// MODO SIN PAREDES  
    if(x1>30)
    x1=0;
    
    if(x1<0>30)
    y1=0;
    
    if(y1<0>30)
    vidas=0;
    
    if(x1<0>31)
    vidas=0;
    
    if(y1<0)
    vidas=0;
   */ //////////////////////////////
    
    
    
    menseki[x1][y1]=1;
  /*  
    if(key[KEY_1_PAD])
    velocidad=1000;
    
    if(key[KEY_2_PAD])
    velocidad=1500;
    
    if(key[KEY_3_PAD])
    velocidad=2000;
    
    if(key[KEY_4_PAD])
    velocidad=9000;
  */  

 
  if(puntos==kol+10)
  {
                    kol=kol+10;
                    c1=rand()%250;
                    c2=rand()%250;
                    c3=rand()%250;
                    
                    
  }
  
  /*///////////////// Serp multicolor juajuajua
                
  color1=color1+puntos*;
  color2=color1*puntos-x1;
  color3=color1+puntos+y1;
  
                
                
 /*/////////////////
 
    for(retardo=0;retardo<10000000>0)&&(vidas>0))
{

taimu--;

objetivo();
hebi();

mostrar_menseki();


if(key[KEY_ESC])
   taimu=0;

}
}

////////////////////////////////////////////////////////////////////////////////

int menu_principal()
{
    while(k=1)
    {
   rectfill(screen,10,10,630,470, 25);
 
   for(q=10000000;q>0;q--)
   rectfill(screen,160,80,500,270, 80);
   
   
   
   for(q=10000000;q>0;q--)
   {
   textprintf_ex(screen,font,200,100,makecol(100,50,0),875,"--SNAKE 0.5 Beta--\n Pulsa ENTER para empezar");
   if(key[KEY_ENTER])
   q=0;
   }
    
   
   
   if(key[KEY_ENTER])
   k=0;
   }
   
   rectfill(screen,10,10,630,470, 25);
    
    
}




int inicializar_programa()
{
allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT,640,480,0,0);
set_palette(desktop_palette);
clear_to_color(screen,makecol(250,250,250));
acquire_screen();
srand(time(NULL));
}


/////////////////////////////////////////////////////////////////////////////////


 
 
 void inicializa_allegro_music()
 {
  
   int driver1,driver2;
   detect_digi_driver(driver1);
   detect_midi_driver(driver2);
   reserve_voices(5,5);
   install_sound(driver1,driver2,"cfg_path");
   set_volume(150,100);
}
   
void poner_musica(MIDI *musica)
{
     play_midi(musica,1);

}

int play_music()
{
    MIDI *musica;
    inicializa_allegro_music();
    musica=load_midi("choco.mid");
    poner_musica(musica);
    
    while((!key[KEY_ESC])&&(controlador=1))
    {
      juego();
               
    rest(10);
    }
    
    destroy_midi(musica);
    
    
    return 0;



}
//////////////////////////////////////////////////////////////////////////////////






void main(void)
{
     

     
inicializar_programa();
play_music();

//menu_principal();
//juego();
limpiar_menseki();
mostrar_menseki();
textprintf_ex(screen,font,200,350,makecol(100,0,25),875,"Pulsa cualquier tecla para salir");
               

readkey();

 




}
END_OF_MAIN()
Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensaje por na_th_an »

Para saber para qué sirve cada parámetro no tienes más que mirar la documentación de Allegro, que no es más que una referencia de las funciones que incluye la biblioteca ordenadas por tipo.
Responder