Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/11/2015, 17:12
charliowow
 
Fecha de Ingreso: noviembre-2014
Mensajes: 11
Antigüedad: 9 años, 6 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 !!