コード例 #1
0
ファイル: atualizar.cpp プロジェクト: ProgLevelup/chien2d
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;
}
コード例 #2
0
ファイル: MiniShooter.cpp プロジェクト: pfrankster/shutar
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;
}
コード例 #3
0
ファイル: atualizar.cpp プロジェクト: ProgLevelup/chien2d
// 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;
}
コード例 #4
0
ファイル: Nave.cpp プロジェクト: pfrankster/shutar
// 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;
}
コード例 #5
0
ファイル: jogo_bola.cpp プロジェクト: ProgLevelup/chien2d
// 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;
}