bool atualizaArqueiro(Ator *a, unsigned int mapa) { switch(a->estado.estado) { case ATOR_NASCENDO: // Muda para o estado adequado ATOR_TrocaEstado(a, ESTADO_ARQUEIRO_INICIO, false); break; case ESTADO_ARQUEIRO_INICIO: if(a->estado.subestado==ESTADO_INICIO) { ATOR_TrocaAnimacao(a, ANIMA_ARQUEIRO_ATIRANDO); a->estado.subestado=ESTADO_RODANDO; } } return true; }
bool MiniShooter_Atualiza(Ator *a, unsigned int idMapa) { Evento ev; switch (a->estado.estado) { case ATOR_NASCENDO: { // Muda para o estado adequado ATOR_TrocaEstado(a, MINISHOOTER_PARADO, false); a->temporizadores[0] = 15; int v2 = rand() % 4; v2 < 1 ? v2 = 1 : v2 = v2; //a->velocidade = 2.1f; a->velocidade = v2; break; } case MINISHOOTER_PARADO: { Evento ev; if (a->estado.subestado == ESTADO_INICIO) { // coloca a animação da nave parada ATOR_TrocaAnimacao(a, 0); // Troca o sub-estado a->estado.subestado = ESTADO_RODANDO; //a->direcao = a->olhandoPara; } while (ATOR_ProximoEvento(a, &ev)) { switch (ev.tipoEvento) { case EVT_COLIDIU_PERSONAGEM: if (ev.subtipo = TIRO_NAVE) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; case EVT_POSICAO: { // Muda a diração na qual o personagem está olhando // Calcula o cateto adjacente e oposto double ca = fabs(a->x - ev.x); double co = fabs(a->y - ev.y); double angulo = 90; // Se o cateto oposto é zero, o angulo é 90º // Senão, calcula if (ca != 0) angulo = atan(co / ca)*RAD_ANG; // Ajusta o quadrante // Primeiro e quarto quadrantes if (ev.x>a->x) { // Está no quarto? if (ev.y>a->y) angulo = 360 - angulo; } // Segundo e terceiro quadrantes else { // Terceiro quadrante if (ev.y>a->y) angulo += 180; // Segundo quadrante else angulo = 180 - angulo; } a->olhandoPara = angulo; a->direcao = a->olhandoPara; break; } case EVT_TEMPO: if (ev.subtipo == 0) { ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = TIRO_INIMIGO; ev.x = a->x; ev.y = a->y; ev.valor = a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->temporizadores[0] = 120; } printf("\nMS ATIRANDO"); break; }//fim switch }//FIM WHILE break; } case ATOR_ENCERRADO: return false; break; //ator encerrado } return true; }
// Funções bool atualizaInimigos(Ator *a, unsigned int mapa) { switch(a->estado.estado) { case ATOR_NASCENDO: // Muda para o estado adequado ATOR_TrocaEstado(a, ESTADO_INIMIGO_INATIVO, false); break; case ESTADO_INIMIGO_INATIVO: if(a->estado.subestado==ESTADO_INICIO) { // Animação de andando ATOR_TrocaAnimacao(a, ANIMA_INIMIGO_ANDANDO); // Muda para o estado adequado ATOR_TrocaEstado(a, ESTADO_INIMIGO_ANDANDO, false); } break; case ESTADO_INIMIGO_ANDANDO: if(a->estado.subestado==ESTADO_INICIO) { a->velocidade = 1.0/(rand() % (MAX_INIMIGOS*2) + 1.0) + 1.0 + a->aux; a->direcao = 0; a->estado.subestado= ESTADO_RODANDO; } else { if (a->x >= 635) { // Animação de andando ATOR_TrocaAnimacao(a, ANIMA_INIMIGO_BATENDO); // Muda para o estado adequado ATOR_TrocaEstado(a, ESTADO_INIMIGO_BATENDO, false); a->velocidade = 0; } } break; case ESTADO_INIMIGO_BATENDO: if(a->estado.subestado==ESTADO_INICIO) { a->estado.subestado= ESTADO_RODANDO; atacantes++; } break; case ESTADO_INIMIGO_MORRENDO: if(a->estado.subestado==ESTADO_INICIO) { // Animação de morrendo ATOR_TrocaAnimacao(a, ANIMA_INIMIGO_MORRENDO); a->velocidade = 0; a->estado.subestado= ESTADO_RODANDO; if (atacantes > 0) atacantes--; } if (a->quadroAtual == 8) { a->x = 0; a->aux+=0.2; // Animação de andando ATOR_TrocaAnimacao(a, ANIMA_INIMIGO_ANDANDO); // Muda para o estado adequado ATOR_TrocaEstado(a, ESTADO_INIMIGO_ANDANDO, false); } break; } return true; }
// A função para fazer a lógica da Nave // // Data: 06/06/2015 // Última atualização: 04/07/2015 // bool Nave_Atualiza(Ator *a, unsigned int mapa) { Evento ev; switch (a->estado.estado) { case ATOR_ENCERRADO: Evento ev; ev.tipoEvento = SUBEVT_FIM_FASE_DERROTA; ATOR_EnviaEventoJogo(&ev); return false; break; case ATOR_NASCENDO: // Muda para o estado adequado ATOR_TrocaEstado(a, NAVE_PARADA, false); // Muda o temporizador para criar o tiro // A escolha da posição 0 no vetor é arbitrária a->aux_int[3] = 1000; a->vidas = 10; a->temporizadores[0] = 1; //?? break; case NAVE_PARADA: a->velocidade = VNAVE *0.5f;; if (a->aux_int[3] < 1000) a->aux_int[3]++; if (a->estado.subestado == ESTADO_INICIO) { // coloca a animação da nave parada ATOR_TrocaAnimacao(a, 2); // Troca o sub-estado a->estado.subestado = ESTADO_RODANDO; } // Pega os eventos e processa while (ATOR_ProximoEvento(a, &ev)) { // se for um evento de movimentação switch (ev.tipoEvento) { case EVT_COLIDIU_PERSONAGEM: { //se vida chegou ao fim encerra o ator if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); if (ev.subtipo == TIRO_INIMIGO) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); //ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas--; } if (ev.subtipo == MINIRED || ev.subtipo == BATROBO || ev.subtipo == MINISHOOTER || ev.subtipo == REDBOSS) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas = a->vidas - 3; } } if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; // Caso tenha movido o mouse case EVT_POSICAO: { // Muda a diração na qual o personagem está olhando // Calcula o cateto adjacente e oposto double ca = fabs(a->x - ev.x); double co = fabs(a->y - ev.y); double angulo = 90; // Se o cateto oposto é zero, o angulo é 90º // Senão, calcula if (ca != 0) angulo = atan(co / ca)*RAD_ANG; // Ajusta o quadrante // Primeiro e quarto quadrantes if (ev.x>a->x) { // Está no quarto? if (ev.y>a->y) angulo = 360 - angulo; } // Segundo e terceiro quadrantes else { // Terceiro quadrante if (ev.y>a->y) angulo += 180; // Segundo quadrante else angulo = 180 - angulo; } a->olhandoPara = angulo; break; } /***************************************/ case EVT_PRESSIONOU_BOTAO1: a->direcao = a->olhandoPara; //a->velocidade = VNAVE; // Muda o estado ATOR_TrocaEstado(a, NAVE_DESLOCANDO, false); break; case EVT_PRESSIONOU_BOTAO2: a->velocidade = 0; ATOR_TrocaEstado(a, NAVE_ESTABILIZANDO, false); break; case EVT_LIBEROU_BOTAO2: ATOR_TrocaEstado(a, NAVE_PARADA, false); break; case EVT_PRESSIONOU_BOTAO3: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = TIRO_NAVE; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 50; //reduz energia ao atirar break; case EVT_PRESSIONOU_BOTAO4: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = BOMBA; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 150; //reduz energia ao atirar break; /**********************ACHOU CHECKPOINTS **************************************************/ case EVT_CHECKPOINT: /*ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = REDBOSS; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev);*/ break; /************************************************************************/ } } break; case NAVE_ESTABILIZANDO: // coloca a animação da nave estabilizando ATOR_TrocaAnimacao(a, 4); while (ATOR_ProximoEvento(a, &ev)) { // se for um evento de movimentação switch (ev.tipoEvento) { case EVT_COLIDIU_PERSONAGEM: { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); if (ev.subtipo == TIRO_INIMIGO) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); //ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas--; } if (ev.subtipo == MINIRED || ev.subtipo == BATROBO || ev.subtipo == MINISHOOTER || ev.subtipo == REDBOSS) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas = a->vidas - 3; } //se vida chegou ao fim encerra o ator } if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; // Caso tenha movido o mouse case EVT_POSICAO: { // Muda a diração na qual o personagem está olhando // Calcula o cateto adjacente e oposto double ca = fabs(a->x - ev.x); double co = fabs(a->y - ev.y); double angulo = 90; // Se o cateto oposto é zero, o angulo é 90º // Senão, calcula if (ca != 0) angulo = atan(co / ca)*RAD_ANG; // Ajusta o quadrante // Primeiro e quarto quadrantes if (ev.x>a->x) { // Está no quarto? if (ev.y>a->y) angulo = 360 - angulo; } // Segundo e terceiro quadrantes else { // Terceiro quadrante if (ev.y>a->y) angulo += 180; // Segundo quadrante else angulo = 180 - angulo; } a->olhandoPara = angulo; break; } /***************************************/ case EVT_PRESSIONOU_BOTAO1: a->direcao = a->olhandoPara; //a->velocidade = VNAVE; // Muda o estado ATOR_TrocaEstado(a, NAVE_DESLOCANDO, false); if (a->aux_int[3] > 0) a->aux_int[3]--; break; case EVT_PRESSIONOU_BOTAO2: a->velocidade = 0; ATOR_TrocaEstado(a, NAVE_ESTABILIZANDO, false); a->aux_int[3] -= .5f; break; case EVT_LIBEROU_BOTAO2: ATOR_TrocaEstado(a, NAVE_PARADA, false); break; case EVT_PRESSIONOU_BOTAO3: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = TIRO_NAVE; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 50; break; case EVT_PRESSIONOU_BOTAO4: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = BOMBA; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 150; //reduz energia ao atirar break; /**********************ACHOU CHECKPOINTS **************************************************/ case EVT_CHECKPOINT: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = REDBOSS; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); break; /************************************************************************/ } } break; case NAVE_DESLOCANDO: if (a->estado.subestado == ESTADO_INICIO) { // coloca a animação da nave parada ATOR_TrocaAnimacao(a, 3); ATOR_TocaEfeitoTela(a, 1, mapa); // Troca o sub-estado a->estado.subestado = ESTADO_RODANDO; } // Pega os eventos e processa while (ATOR_ProximoEvento(a, &ev)) { // se for um evento de movimentação switch (ev.tipoEvento) { case EVT_COLIDIU_PERSONAGEM: { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); if (ev.subtipo == TIRO_INIMIGO) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); //ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas--; } if (ev.subtipo == MINIRED || ev.subtipo == BATROBO || ev.subtipo == MINISHOOTER || ev.subtipo == REDBOSS) { if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); a->vidas = a->vidas - 3; } //se vida chegou ao fim encerra o ator } if (a->vidas <= 0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; case EVT_PRESSIONOU_BOTAO3: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = TIRO_NAVE; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 50; //a->temporizadores[0] = 30; break; case EVT_PRESSIONOU_BOTAO4: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = BOMBA; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); a->aux_int[3] -= 150; //reduz energia ao atirar break; /***********************************************************************************************/ case EVT_CHECKPOINT: ev.tipoEvento = EVT_CRIA_PERSONAGEM; ev.subtipo = REDBOSS; ev.x = a->x; ev.y = a->y; ev.valor = (int)a->olhandoPara; ATOR_EnviaEventoJogo(&ev); break; /**********************************************************************************************/ case EVT_PRESSIONOU_BOTAO1: a->direcao = a->olhandoPara; a->velocidade = VNAVE; if (a->aux_int[3] > 0) a->aux_int[3]--; break; case EVT_LIBEROU_BOTAO1: //a->velocidade = 0; ATOR_TrocaEstado(a, NAVE_PARADA, false); //a->velocidade = 0; break; case EVT_PRESSIONOU_BOTAO2: a->velocidade = 0; ATOR_TrocaEstado(a, NAVE_ESTABILIZANDO, false); break; case EVT_LIBEROU_BOTAO2: ATOR_TrocaEstado(a, NAVE_PARADA, false); break; /*------------------*/ case EVT_PERDE_FOCO_TELA: break; // Caso tenha movido o mouse case EVT_POSICAO: { // Muda a diração na qual o personagem está olhando // Calcula o cateto adjacente e oposto double ca = fabs(a->x - ev.x); double co = fabs(a->y - ev.y); double angulo = 90; // Se o cateto oposto é zero, o angulo é 90º // Senão, calcula if (ca != 0) angulo = atan(co / ca)*RAD_ANG; // Ajusta o quadrante // Primeiro e quarto quadrantes if (ev.x>a->x) { // Está no quarto? if (ev.y>a->y) angulo = 360 - angulo; } // Segundo e terceiro quadrantes else { // Terceiro quadrante if (ev.y>a->y) angulo += 180; // Segundo quadrante else angulo = 180 - angulo; } a->olhandoPara = angulo; break; } //TENTAR COLOCAR COMBUSTIVEL NO TEMPO A SER REDUZIDO E COLETADO case EVT_TEMPO: if (ev.subtipo == 0) { // } break; } } } return true; }
// A função para fazer a lógica do DarkPhoenix // // Data: 04/09/2008 // Última atualização: 04/09/2008 // bool AtualizaBola(Ator *a, unsigned int mapa) { Evento ev; switch(a->estado.estado) { case ATOR_NASCENDO: // Muda para o estado adequado ATOR_TrocaEstado(a, BOLA_PULANDO, false); break; case BOLA_PULANDO: if(a->estado.subestado==ESTADO_INICIO) { a->velocidade=2; a->estado.subestado=ESTADO_RODANDO; if(a->direcao==0) ATOR_TrocaAnimacao(a, 1); else ATOR_TrocaAnimacao(a, 0); a->aux_int[0]=3; ATOR_Impulsiona(a, 300); } while(ATOR_ProximoEvento(a, &ev)) { switch(ev.tipoEvento) { case EVT_FOCO_TELA: printf("Personagem entrou na tela.\n"); break; case EVT_PERDE_FOCO_TELA: printf("Personagem saiu da tela.\n"); break; case EVT_SAIU_FORA_MAPA: ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; case EVT_COLIDIU_PAREDE: if(ev.subtipo==SUBEVT_COLIDIU_PAREDE_BAIXO) { if(--a->aux_int[0] == 0) { if(a->direcao==0) a->direcao=180; else a->direcao=0; ATOR_TrocaEstado(a, BOLA_PULANDO, false); } else ATOR_Impulsiona(a, 300); } else if(ev.subtipo!=SUBEVT_COLIDIU_PAREDE_CIMA) ATOR_TrocaEstado(a, BOLA_PULANDO, false); break; case EVT_COLIDIU_PERSONAGEM: ATOR_TrocaEstado(a, BOLA_MORRENDO, false); break; } } break; case BOLA_MORRENDO: if(a->estado.subestado == ESTADO_INICIO) { ATOR_TrocaAnimacao(a, 2); a->velocidade=0; a->temporizadores[0] = 60; a->estado.subestado = ESTADO_RODANDO; } while(ATOR_ProximoEvento(a, &ev)) { switch(ev.tipoEvento) { break; case EVT_TEMPO: if(ev.subtipo==0) ATOR_TrocaEstado(a, ATOR_ENCERRADO, false); break; } } break; case ATOR_ENCERRADO: return false; } return true; }