Skip to content
Snippets Groups Projects
Commit d7ba2e7a authored by Cristian Weiland's avatar Cristian Weiland
Browse files

Merge branch 'animacao_flash' into 'develop'

Animacao flash

Usar flash deixa uma fumacinha pra indicar de onde você saiu.

See merge request !25
parents 34713fb6 9f487d54
Branches
No related tags found
1 merge request!25Animacao flash
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
78 78
80 80
77 77
1 9
11 11
12 12
10 10
......
Imgs/blastoise.png

75.7 KiB

Imgs/coin.jpg

72.3 KiB

Imgs/smoke.bmp

5.79 KiB

...@@ -34,6 +34,11 @@ ...@@ -34,6 +34,11 @@
#define FIREBALLS_P_PESSOA 2 #define FIREBALLS_P_PESSOA 2
#define COMANDOS_POR_PERSONAGEM 8 #define COMANDOS_POR_PERSONAGEM 8
/* Defines para flash */
#define FLASH_SPRITE_WIDTH 22
#define FLASH_SPRITE_HEIGHT 22
#define MAX_FLASH_POSSIVEL 5
typedef struct Pessoa { typedef struct Pessoa {
int x,y,desx,desy,selx,sely,hp; // Desx e desy escolhem o char na imagem; Selx e sely escolhem qual sprite do char (olhando pra cima,esq,...) int x,y,desx,desy,selx,sely,hp; // Desx e desy escolhem o char na imagem; Selx e sely escolhem qual sprite do char (olhando pra cima,esq,...)
int xneon,yneon; int xneon,yneon;
...@@ -48,7 +53,7 @@ typedef struct Pessoa { ...@@ -48,7 +53,7 @@ typedef struct Pessoa {
} Pessoa; } Pessoa;
typedef struct Magia { typedef struct Magia {
int dano,x,y,dist,xexpl,yexpl, energia; int dano, x, y, dist, xsprite, ysprite, xexpl, yexpl, energia, count;
bool ativa, explosao; bool ativa, explosao;
ALLEGRO_BITMAP* sprite; ALLEGRO_BITMAP* sprite;
int d; /* Direcao == -1 significa que nao foi calculada ainda. int d; /* Direcao == -1 significa que nao foi calculada ainda.
...@@ -59,6 +64,7 @@ typedef struct Magias { ...@@ -59,6 +64,7 @@ typedef struct Magias {
int explox[PESSOAS][FIREBALLS_P_PESSOA], exploy[PESSOAS][FIREBALLS_P_PESSOA]; // Selecionam a posicao da explosao no bitmap explo.bmp. int explox[PESSOAS][FIREBALLS_P_PESSOA], exploy[PESSOAS][FIREBALLS_P_PESSOA]; // Selecionam a posicao da explosao no bitmap explo.bmp.
Magia fireball[PESSOAS][FIREBALLS_P_PESSOA]; Magia fireball[PESSOAS][FIREBALLS_P_PESSOA];
Magia iceball[PESSOAS][ICEBALLS_P_PESSOA]; Magia iceball[PESSOAS][ICEBALLS_P_PESSOA];
Magia flash[PESSOAS][MAX_FLASH_POSSIVEL];
} Magias; } Magias;
typedef struct Sprite { typedef struct Sprite {
...@@ -66,6 +72,7 @@ typedef struct Sprite { ...@@ -66,6 +72,7 @@ typedef struct Sprite {
ALLEGRO_BITMAP **fireballs, *explosion; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball. ALLEGRO_BITMAP **fireballs, *explosion; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball.
ALLEGRO_BITMAP **iceballs, *gelos; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball. ALLEGRO_BITMAP **iceballs, *gelos; // Sprite da bola de fogo (cima, dir, esq, baixo) + explosao da fireball.
ALLEGRO_BITMAP **neons; // Todos os neons (4 cores, na sequencia: amarelo - azul - verde - vermelho) ALLEGRO_BITMAP **neons; // Todos os neons (4 cores, na sequencia: amarelo - azul - verde - vermelho)
ALLEGRO_BITMAP *animacao_flash;
ALLEGRO_BITMAP *bar, *healthbar, *energybar, *frente; ALLEGRO_BITMAP *bar, *healthbar, *energybar, *frente;
ALLEGRO_BITMAP *chars, *dead, *chars_congelados; ALLEGRO_BITMAP *chars, *dead, *chars_congelados;
} Sprite; } Sprite;
......
...@@ -144,6 +144,13 @@ Sprite init_sprites(FILE *errext) { ...@@ -144,6 +144,13 @@ Sprite init_sprites(FILE *errext) {
exit(1); exit(1);
} }
s.animacao_flash = al_load_bitmap("Imgs/smoke.bmp");
if(!(s.animacao_flash)) {
fprintf(errext,"Falha ao abrir a imagem smoke.");
fclose(errext);
exit(1);
}
s.neons[0] = al_load_bitmap("Imgs/neonamarelo.bmp"); s.neons[0] = al_load_bitmap("Imgs/neonamarelo.bmp");
if(!s.neons[0]) { if(!s.neons[0]) {
fprintf(errext,"Falha ao abrir a imagem s.neons[0]."); fprintf(errext,"Falha ao abrir a imagem s.neons[0].");
...@@ -235,6 +242,7 @@ Sprite init_sprites(FILE *errext) { ...@@ -235,6 +242,7 @@ Sprite init_sprites(FILE *errext) {
al_convert_mask_to_alpha(s.explosion,al_map_rgb(255,0,255)); al_convert_mask_to_alpha(s.explosion,al_map_rgb(255,0,255));
al_convert_mask_to_alpha(s.healthbar,al_map_rgb(255,0,255)); al_convert_mask_to_alpha(s.healthbar,al_map_rgb(255,0,255));
al_convert_mask_to_alpha(s.energybar,al_map_rgb(255,0,255)); al_convert_mask_to_alpha(s.energybar,al_map_rgb(255,0,255));
al_convert_mask_to_alpha(s.animacao_flash,al_map_rgb(255,0,255));
al_convert_mask_to_alpha(s.chars_congelados,al_map_rgb(255,0,255)); al_convert_mask_to_alpha(s.chars_congelados,al_map_rgb(255,0,255));
for(i=0;i<4;i++) { for(i=0;i<4;i++) {
al_convert_mask_to_alpha(s.neons[i],al_map_rgb(255,0,255)); al_convert_mask_to_alpha(s.neons[i],al_map_rgb(255,0,255));
......
...@@ -170,9 +170,3 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad ...@@ -170,9 +170,3 @@ int imprime_4_chars_for(int cont,char** matriz,int *cor,bool *temneon,int njogad
al_destroy_font(font); al_destroy_font(font);
return 1; return 1;
} }
/*
MAX_ENERGY - 100%
P[I].ENERGIA - X%
*/
\ No newline at end of file
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
void init_magias(Magias *m, int njogadores) { void init_magias(Magias *m, int njogadores) {
int i,j; int i,j;
if(njogadores > PESSOAS) { // Vai dar seg fault.
printf("Njogadores (%d) maior que pessoas (%d). Abortando.", njogadores, PESSOAS);
exit(1);
}
/* Inicializa fireball.
for(i=0; i<njogadores; ++i) { for(i=0; i<njogadores; ++i) {
for(j=0; j<2; ++j) { for(j=0; j<2; ++j) {
m->fireball[i][j].ativa = false; // Nao foi usada. m->fireball[i][j].ativa = false; // Nao foi usada.
...@@ -13,7 +18,9 @@ void init_magias(Magias *m, int njogadores) { ...@@ -13,7 +18,9 @@ void init_magias(Magias *m, int njogadores) {
m->exploy[i][j] = 220; m->exploy[i][j] = 220;
} }
} }
*/
for(i=0; i<njogadores; ++i) { for(i=0; i<njogadores; ++i) {
/* Inicializa iceball. */
for(j=0; j<2; ++j) { for(j=0; j<2; ++j) {
m->iceball[i][j].ativa = false; // Nao foi usada. m->iceball[i][j].ativa = false; // Nao foi usada.
m->iceball[i][j].dano = 25; // Dano da tecnica. m->iceball[i][j].dano = 25; // Dano da tecnica.
...@@ -22,6 +29,12 @@ void init_magias(Magias *m, int njogadores) { ...@@ -22,6 +29,12 @@ void init_magias(Magias *m, int njogadores) {
m->iceball[i][j].dist = 0; // Nao percorreu nenhuma distancia. m->iceball[i][j].dist = 0; // Nao percorreu nenhuma distancia.
m->iceball[i][j].d = -1; // Nao tem direçao. m->iceball[i][j].d = -1; // Nao tem direçao.
} }
/* Inicializa animacao do flash. */
for(j=0; j<MAX_FLASH_POSSIVEL; ++j) {
m->flash[i][j].ativa = false; // Nao foi usada.
m->flash[i][j].count = 0;
m->flash[i][j].xsprite = 88;
}
} }
} }
...@@ -214,17 +227,38 @@ void usa_iceball(char **matriz, Pessoa *p, Magias *m, Sprite s, int njogadores) ...@@ -214,17 +227,38 @@ void usa_iceball(char **matriz, Pessoa *p, Magias *m, Sprite s, int njogadores)
} }
} }
void usa_magias(char **matriz, Pessoa *p, int njogadores, Sprite s, int *flash, Magias *m) void animacao_flash(Pessoa *p, int njogadores, Sprite s, Magias *m) {
{ int i, j;
usa_flash(p, flash, matriz, njogadores); for(i=0; i<njogadores; ++i) {
usa_fireball(matriz, p, m, njogadores); for(j=0; j<MAX_FLASH_POSSIVEL; ++j) {
explosao(p, njogadores,s, m); if(m->flash[i][j].ativa == true) { // Enquanto xsprite = 88, ele nao imprime a animacao. Quando xprite = 0, ele comeca a animacao.
m->flash[i][j].xsprite = 0;
m->flash[i][j].ativa = false;
m->flash[i][j].count = 0;
}
if(m->flash[i][j].xsprite < 88) { // Imprime a animação.
// printf("Imprimindo %d e %d, count = %d, xsprite = %d, x = %d, y = %d...\n", i, j, m->flash[i][j].count, m->flash[i][j].xsprite, m->flash[i][j].x, m->flash[i][j].y);
al_draw_bitmap_region(s.animacao_flash,m->flash[i][j].xsprite,0,FLASH_SPRITE_WIDTH,FLASH_SPRITE_HEIGHT,m->flash[i][j].x,m->flash[i][j].y,0);
if(m->flash[i][j].count == 3) {
m->flash[i][j].xsprite += FLASH_SPRITE_WIDTH;
m->flash[i][j].count = 0;
}
++(m->flash[i][j].count);
}
}
}
}
void usa_magias(char **matriz, Pessoa *p, int njogadores, Sprite s, int *flash, Magias *m) {
usa_flash(p, flash, matriz, njogadores, m);
animacao_flash(p, njogadores, s, m);
usa_iceball(matriz, p, m, s, njogadores); usa_iceball(matriz, p, m, s, njogadores);
// usa_fireball(matriz, p, m, njogadores);
// explosao(p, njogadores, s, m);
return ; return ;
} }
int calcula_direcao(Pessoa *p,int i) int calcula_direcao(Pessoa *p,int i) {
{
if(p[i].andou_c == 1 || (p[i].andou_b == 0 && p[i].andou_c == 0 && p[i].andou_d == 0 && p[i].andou_e == 0)) { // Olhando pra cima. if(p[i].andou_c == 1 || (p[i].andou_b == 0 && p[i].andou_c == 0 && p[i].andou_d == 0 && p[i].andou_e == 0)) { // Olhando pra cima.
return 0; return 0;
} }
...@@ -240,8 +274,7 @@ int calcula_direcao(Pessoa *p,int i) ...@@ -240,8 +274,7 @@ int calcula_direcao(Pessoa *p,int i)
return -1; // Deu erro. return -1; // Deu erro.
} }
void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores) void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores, Magias *m) {
{
/* Por favor otimizar isso aqui. O for(j=0; j<19) tem 8 ifs dentro. Nao da pra puxar o if pra fora /* Por favor otimizar isso aqui. O for(j=0; j<19) tem 8 ifs dentro. Nao da pra puxar o if pra fora
e escolher qual deles eh feito, e dai fazer as 19 iteracoes? Alem disso, se colidiu uma vez, colidiu e escolher qual deles eh feito, e dai fazer as 19 iteracoes? Alem disso, se colidiu uma vez, colidiu
pra sempre, entao pode dar um break/return (cuidar com diagonais dai!) pra sempre, entao pode dar um break/return (cuidar com diagonais dai!)
...@@ -250,6 +283,16 @@ void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores) ...@@ -250,6 +283,16 @@ void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores)
for(i=0; i<njogadores; ++i) { for(i=0; i<njogadores; ++i) {
if(flash[i] && p[i].energia >= 60 && p[i].hp > 0 && p[i].freeze <= 0) { if(flash[i] && p[i].energia >= 60 && p[i].hp > 0 && p[i].freeze <= 0) {
flash[i] = 0; flash[i] = 0;
// Ativar a animação.
for(j=0; j<MAX_FLASH_POSSIVEL; ++j) {
if(m->flash[i][j].xsprite >= 88) {
// Escolhi uma instância da animação. Ativa ela e sai.
m->flash[i][j].ativa = true;
m->flash[i][j].x = p[i].x;
m->flash[i][j].y = p[i].y;
break;
}
}
p[i].energia -= 60; p[i].energia -= 60;
/* Existem 8 casos (8 direçoes possiveis de andar, 4 sentidos e 4 diagonais). */ /* Existem 8 casos (8 direçoes possiveis de andar, 4 sentidos e 4 diagonais). */
for(j=0; j<19; ++j) { for(j=0; j<19; ++j) {
......
...@@ -9,8 +9,9 @@ void calcula_status(Pessoa *p, int njogadores); ...@@ -9,8 +9,9 @@ void calcula_status(Pessoa *p, int njogadores);
void usa_fireball(char **matriz, Pessoa *p, Magias *m, int njogadores); void usa_fireball(char **matriz, Pessoa *p, Magias *m, int njogadores);
void explosao(Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2], Magias *m); void explosao(Pessoa *p, int njogadores, Sprite s,int explox[4][2],int exploy[4][2], Magias *m);
void usa_iceball(char **matriz, Pessoa *p, Magias *m, Sprite s, int njogadores); void usa_iceball(char **matriz, Pessoa *p, Magias *m, Sprite s, int njogadores);
void animacao_flash(Pessoa *p, int njogadores, Sprite s, Magias *m);
void usa_magias(char **matriz, Pessoa *pessoas, int njogadores, Sprite s, int *flash, Magias *m); void usa_magias(char **matriz, Pessoa *pessoas, int njogadores, Sprite s, int *flash, Magias *m);
int calcula_direcao(Pessoa *p,int i); int calcula_direcao(Pessoa *p,int i);
void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores); void usa_flash(Pessoa *p, int *flash, char **matriz, int njogadores, Magias *m);
#endif #endif
\ No newline at end of file
...@@ -18,7 +18,6 @@ Problemas: ...@@ -18,7 +18,6 @@ Problemas:
#define CONT 2 #define CONT 2
#define CONTEXPLO 9 #define CONTEXPLO 9
#define TAM 1000 #define TAM 1000
#define NJOGADORES 5
int main() int main()
{ {
...@@ -41,8 +40,8 @@ int main() ...@@ -41,8 +40,8 @@ int main()
} }
// Isso tem que ficar depois do abremenu. // Isso tem que ficar depois do abremenu.
p = (Pessoa *) malloc(sizeof(Pessoa) * NJOGADORES); p = (Pessoa *) malloc(sizeof(Pessoa) * PESSOAS);
for(i=0; i<NJOGADORES; ++i) { for(i=0; i<PESSOAS; ++i) {
// Inicializacoes da estrutura Pessoa // Inicializacoes da estrutura Pessoa
p[i].hp = MAX_HP; p[i].hp = MAX_HP;
p[i].selx = 0; p[i].selx = 0;
...@@ -69,7 +68,7 @@ int main() ...@@ -69,7 +68,7 @@ int main()
/* Inicializacao dos Bitmaps */ /* Inicializacao dos Bitmaps */
Sprite s = init_sprites(errext); Sprite s = init_sprites(errext);
init_magias(&m, NJOGADORES); init_magias(&m, PESSOAS);
al_register_event_source(win.event_queue, al_get_display_event_source(win.display)); al_register_event_source(win.event_queue, al_get_display_event_source(win.display));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment