Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Generar animaciones en c++ allegro

Estas en el tema de Generar animaciones en c++ allegro en el foro de C/C++ en Foros del Web. Hola muy buenas a todos estoy intentando programar un juego por primera vez, algo sencillito. Por ahora he generado una pequeña instancia donde mover mi ...
  #1 (permalink)  
Antiguo 12/11/2015, 17:12
 
Fecha de Ingreso: noviembre-2014
Mensajes: 11
Antigüedad: 9 años, 5 meses
Puntos: 0
Generar animaciones en c++ allegro

Hola muy buenas a todos estoy intentando programar un juego por primera vez, algo sencillito.

Por ahora he generado una pequeña instancia donde mover mi personaje pero mi problema reside en que no consigo animarlo bien, me explico, tengo 2 frames para la animacion del movimiento a la derecha, dos mas para el de la izquierda i dos mas por si el personaje esta estatico.

El problema es que no consigo que el programa primero imprima una imagen y despues la otra, produciendo esa sensacion de movimiento. Simplemente se montan todas las imagenes una encima de la otra superponiendose, he probado con clear (buffer) he probado con rest(200), enfin, nose que es lo que tengo mal exactamente.

Si me haceis el inmenso favor de repasar mi codigo os lo pego aqui:

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

*****************Esta funcion dibuja mi char**************************

void dibujar_soldado(int coordenadaX, int coordenadaY, int dirX, int estatico){




if (estatico == 1 && dirX == 0){
clear(BufferSoldado);
blit(SoldadoEDS,BufferSoldado,0,0,0,0,128,128);

//Con esta funcion dibujamos nuestra imagen sobre el buffer, las primeras dos coordenadas definen el punto inicial des de donde cojeremos la imagen por tanto si tenemos dos fotos en una cons dos solados la 00 me cojera la primera foto i la 64 0 me cojera la segunda foto dentro de mi buffer de 64x64

rectfill(SoldadoIS1, 128,128, 200,200, makecol(255,255,255));

// Esta funcion se encarga de evitar que se imprima el fondo blanco del soldado, le estoy diciendo que me remueva el color 255,0,255 que es un fonfo lila 100% rojo i 100% azul

draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);

//con esta funcion respetamos la transparencia para imprimir el buffer sobre el buffersoldado y que no se vea el cuadro blanco

clear(BufferSoldado);

blit(SoldadoEDS2,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoIS2, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);

}else{
if(estatico == 1 && dirX == 1){
clear(BufferSoldado);
blit(SoldadoEIS,BufferSoldado,0,0,0,0,128,128);



rectfill(SoldadoEIS, 128,128, 200,200, makecol(255,255,255));/
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);
clear(BufferSoldado);
blit(SoldadoEIS2,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoEIS2, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);

}
}

if (dirX == 0){
clear(BufferSoldado);
blit(SoldadoDS1,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoDS1, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);


clear(BufferSoldado);
blit(SoldadoDS2,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoDS2, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);


}else{
if (dirX == 1){
clear(BufferSoldado);
blit(SoldadoIS1,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoIS1, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);
clear(BufferSoldado);
blit(SoldadoIS2,BufferSoldado,0,0,0,0,128,128);
rectfill(SoldadoIS2, 128,128, 200,200, makecol(255,255,255));
draw_sprite(buffer,BufferSoldado,coordenadaX, coordenadaY);


}
}

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

***************En esta funcion ejecuto el juego i el movimiento del char******

int coordenadaX = 352;
int coordenadaY = 320;//En estas dos variables declaramos la posicion del soldado, de momento lo hemos inicializado en medio del mapa, luego se ira modificacndo su posicion en funcion de las teclas de direccion que pulsemos. Para determinar el punto exacto debemos dividir el tamaño total del mapa entre dos y luego restarle 32, para asignarle al buffer el inicio desde su punto 0,0, si no, la imagen sale desplazada

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int dirX = 2; //variable para saber si se mueve hacia la derecha o hacia la izquierda, es basicamente para imprimir bien la imagen
int dirY = 0;

///////////////////////////////FUNCIONAMIENTO DE EL JUEGO///////////////////////////////////////////////////////////////////////
while(!key[KEY_ESC]){

int estatico = 1;
///////////////////////////////MODIFICAMOS DIRECCION EN FUNCION DE LA TECLA, LA DIRECCION I SUS COORDENADAS/////////////////////////////////////////////////////////////////
if (key[KEY_RIGHT]){
estatico = 0;
dirX = 0;
coordenadaX = coordenadaX + 32;//modificando estos +32 puedo determinar el avanze del soldado y esto le afectara como realentizacions o como turbo

}else{
if (key[KEY_LEFT]){
estatico = 0;
dirX = 1;
coordenadaX = coordenadaX - 32;

}else{
if (key[KEY_UP]){

dirY = 2;
coordenadaY = coordenadaY -32;

}else{
if (key[KEY_DOWN]){

dirY = 3;
coordenadaY = coordenadaY + 32;

}
}
}
}
clear(buffer);
clear(BufferSoldado);
rest(150);
dibujar_mapa();
dibujar_soldado(coordenadaX, coordenadaY, dirX, estatico);
imprimir_pantalla();


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

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



}

}

END_OF_MAIN();


Muchisimas gracias a todos un saludo !!
  #2 (permalink)  
Antiguo 13/11/2015, 11:39
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Generar animaciones en c++ allegro

Bueno amigo... Se trata de un juego. Ponga el proyecto, o al menos diga la versión de Allegro, y las imágenes suba a un server para que podamos hacer algunas pruebas.
Ademas deberías poner el Highlight en el código que se agradece, pues se ve mejor.

Lo del Highlight te lo dejo yo, pero la próxima elija Highlight e escoja C++.
Código C++:
Ver original
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  2.  
  3. *****************Esta funcion dibuja mi char**************************
  4.  
  5. void dibujar_soldado ( int coordenadaX, int coordenadaY, int dirX, int estatico ) {
  6.     if ( estatico == 1 && dirX == 0 ) {
  7.         clear ( BufferSoldado );
  8.         blit ( SoldadoEDS, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  9.        
  10.         //Con esta funcion dibujamos nuestra imagen sobre el buffer, las primeras dos coordenadas definen el punto inicial des de donde cojeremos la imagen por tanto si tenemos dos fotos en una cons dos solados la 00 me cojera la primera foto i la 64 0 me cojera la segunda foto dentro de mi buffer de 64x64
  11.        
  12.         rectfill ( SoldadoIS1, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  13.        
  14.         // Esta funcion se encarga de evitar que se imprima el fondo blanco del soldado, le estoy diciendo que me remueva el color 255,0,255 que es un fonfo lila 100% rojo i 100% azul
  15.        
  16.         draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  17.        
  18.         //con esta funcion respetamos la transparencia para imprimir el buffer sobre el buffersoldado y que no se vea el cuadro blanco
  19.        
  20.         clear ( BufferSoldado );
  21.        
  22.         blit ( SoldadoEDS2, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  23.         rectfill ( SoldadoIS2, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  24.         draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  25.        
  26.     } else {
  27.         if ( estatico == 1 && dirX == 1 ) {
  28.             clear ( BufferSoldado );
  29.             blit ( SoldadoEIS, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  30.            
  31.            
  32.            
  33.             rectfill ( SoldadoEIS, 128, 128, 200, 200, makecol ( 255, 255, 255 ) ); /
  34.             draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  35.             clear ( BufferSoldado );
  36.             blit ( SoldadoEIS2, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  37.             rectfill ( SoldadoEIS2, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  38.             draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  39.            
  40.         }
  41.     }
  42.    
  43.     if ( dirX == 0 ) {
  44.         clear ( BufferSoldado );
  45.         blit ( SoldadoDS1, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  46.         rectfill ( SoldadoDS1, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  47.         draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  48.        
  49.        
  50.         clear ( BufferSoldado );
  51.         blit ( SoldadoDS2, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  52.         rectfill ( SoldadoDS2, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  53.         draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  54.        
  55.        
  56.     } else {
  57.         if ( dirX == 1 ) {
  58.             clear ( BufferSoldado );
  59.             blit ( SoldadoIS1, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  60.             rectfill ( SoldadoIS1, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  61.             draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  62.             clear ( BufferSoldado );
  63.             blit ( SoldadoIS2, BufferSoldado, 0, 0, 0, 0, 128, 128 );
  64.             rectfill ( SoldadoIS2, 128, 128, 200, 200, makecol ( 255, 255, 255 ) );
  65.             draw_sprite ( buffer, BufferSoldado, coordenadaX, coordenadaY );
  66.            
  67.            
  68.         }
  69.     }
  70.    
  71.     ////////////////////////////////////////////////////////////////////////////////////////////////////////
  72.    
  73.     ***************En esta funcion ejecuto el juego i el movimiento del char******
  74.    
  75.     int coordenadaX = 352;
  76.     int coordenadaY = 320;//En estas dos variables declaramos la posicion del soldado, de momento lo hemos inicializado en medio del mapa, luego se ira modificacndo su posicion en funcion de las teclas de direccion que pulsemos. Para determinar el punto exacto debemos dividir el tamaño total del mapa entre dos y luego restarle 32, para asignarle al buffer el inicio desde su punto 0,0, si no, la imagen sale desplazada
  77.    
  78.     /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79.     int dirX = 2; //variable para saber si se mueve hacia la derecha o hacia la izquierda, es basicamente para imprimir bien la imagen
  80.     int dirY = 0;
  81.    
  82.     ///////////////////////////////FUNCIONAMIENTO DE EL JUEGO///////////////////////////////////////////////////////////////////////
  83.     while ( !key[KEY_ESC] ) {
  84.    
  85.         int estatico = 1;
  86.        
  87.         ///////////////////////////////MODIFICAMOS DIRECCION EN FUNCION DE LA TECLA, LA DIRECCION I SUS COORDENADAS/////////////////////////////////////////////////////////////////
  88.         if ( key[KEY_RIGHT] ) {
  89.             estatico = 0;
  90.             dirX = 0;
  91.             coordenadaX = coordenadaX + 32;//modificando estos +32 puedo determinar el avanze del soldado y esto le afectara como realentizacions o como turbo
  92.            
  93.         } else {
  94.             if ( key[KEY_LEFT] ) {
  95.                 estatico = 0;
  96.                 dirX = 1;
  97.                 coordenadaX = coordenadaX - 32;
  98.                
  99.             } else {
  100.                 if ( key[KEY_UP] ) {
  101.                
  102.                     dirY = 2;
  103.                     coordenadaY = coordenadaY - 32;
  104.                    
  105.                 } else {
  106.                     if ( key[KEY_DOWN] ) {
  107.                    
  108.                         dirY = 3;
  109.                         coordenadaY = coordenadaY + 32;
  110.                        
  111.                     }
  112.                 }
  113.             }
  114.         }
  115.        
  116.         clear ( buffer );
  117.         clear ( BufferSoldado );
  118.         rest ( 150 );
  119.         dibujar_mapa();
  120.         dibujar_soldado ( coordenadaX, coordenadaY, dirX, estatico );
  121.         imprimir_pantalla();
  122.        
  123.        
  124.         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125.        
  126.         //////////////////////////////////////////////////////////////////////////////////////
  127.        
  128.        
  129.        
  130.     }
  131.    
  132. }
  133.  
  134. END_OF_MAIN();

Suba las imágenes o el proyecto entero a un servidor y ponga aquí. Siendo así conseguirás más ayuda.
  #3 (permalink)  
Antiguo 13/11/2015, 17:13
 
Fecha de Ingreso: noviembre-2014
Mensajes: 11
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Generar animaciones en c++ allegro

Muchas gracias pro los consejos soy nuevo y todabia voy perdido ! enseguido subo las imagenes y el codigo :)

Etiquetas: char, funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:21.