void ProcessaControle(Ator *a)
{
	static Evento ev;
	static C2D2_Botao *teclado = C2D2_PegaTeclas();
	// TEsta se envia mensagens
	if(teclado[C2D2_CIMA].pressionado)
	{
		ev.tipoEvento = EVT_PRESSIONOU_CIMA;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_CIMA].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_CIMA;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_BAIXO].pressionado)
	{
		ev.tipoEvento = EVT_PRESSIONOU_BAIXO;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_BAIXO].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_BAIXO;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_ESQUERDA].pressionado)
	{
		ev.tipoEvento = EVT_PRESSIONOU_ESQ;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_ESQUERDA].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_ESQ;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_DIREITA].pressionado)
	{
		ev.tipoEvento = EVT_PRESSIONOU_DIR;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_DIREITA].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_DIR;
		ATOR_EnviaEvento(a, &ev);
	}
	if(teclado[C2D2_Z].pressionado)
	{
		ev.tipoEvento = EVT_PRESSIONOU_BOTAO1;
		ATOR_EnviaEvento(a, &ev);
	}
}
int main(int narg, char **valarg)
{
	// Inicia a Chien2D 2 e testa se deu tudo certo
	if(C2D2_Inicia(LARGURA_TELA, ALTURA_TELA, C2D2_JANELA, C2D2_DESENHO_OPENGL, "Darkphoenix - O Baixinho Invocado"))
		printf("Iniciou a Chien2D 2 com sucesso\n");
	else
	{
		printf("Falhou ao iniciar a Chien2D 2. Encerrando o programa.\n");
		return 0;
	}
	// Inicia as primitivas
	C2D2P_Inicia();
	// Inicia os mapas
	C2D2M_Inicia();
	// Inicia o áudio
	CA2_Inicia();
	// Inicia os personagens
	ATOR_Inicia();
	// Carrega a fonte do sistema
	unsigned int fonte = C2D2_CarregaFonte("fontes/isabelle64_alpha.png", 64);
	// Carrega o mapa
	unsigned int mapa = C2D2M_CarregaMapaMappy("fases/Aula04-Mapa.FMP", "graficos/Aula04-tileset.png");
	// Dá as velocidades. As duas últimas devem ser 1. As demais, incrementa de 1 em 1
	int numcamadas = 4;
	C2D2M_VelocidadeCamadaMapa(mapa, numcamadas-1, 1);
	// Faz um for esotérico para atribuir as velocidades. Se pra você facilitar, use uma camada só que não dá nada
	for(int i=0, vel=numcamadas-1; i<numcamadas-1;i++, vel--)
		C2D2M_VelocidadeCamadaMapa(mapa, i, vel);
	// A camada de marcas é sempre a última
	C2D2M_CamadaMarcas(mapa, 4, 89);
	// Indica a gravidade a aplicar no mapa
	C2D2M_GravidadeMapa(mapa, GRAVIDADE, MAXGRAVIDADE);
	// Carrega o personagem
	bool cdark = JOGO_CarregaDarkPhoenix();
	bool cbola = JOGO_CarregaBola();
	// As músicas
	unsigned int musicas[2];
	musicas[0] = CA2_CarregaMusica("audio/AulaPaulo_byPiovezan.it");
	musicas[1] = CA2_CarregaMusica("audio/venceu.wav");
	// Testa se carregou certo (se é diferente de 0)
	if(fonte==0 || mapa == 0 || !cdark || !cbola)
	{
		printf("Falhou ao carregar alguma coisa. Encerrando.\n");
		// Encerra a Chien2d2
		CA2_Encerra();
		ATOR_Encerra();
		C2D2M_Encerra();
		C2D2_Encerra();
		return 0;
	}
	C2D2_TrocaCorLimpezaTela(121, 188, 255);
	C2D2_Botao *teclado = C2D2_PegaTeclas();
	// cria o personagem
	int x=60, y=60;
	C2D2M_PrimeiroBlocoMarca(mapa, C2D2M_INICIO, &x, &y);
	Ator *dark = ATOR_CriaAtor(DARKPHOENIX, x, y, 0);
	Evento ev;
	bool nafase=true;
	// Procura saber quantos inimigos tem na fase
	int numInimigos=0;
	if(C2D2M_PrimeiroBlocoMarca(mapa, MARCA_BOLA_DIREITA, &x, &y))
	{
		numInimigos++;
		while(C2D2M_ProximoBlocoMarca(mapa, &x, &y))
			numInimigos++;
	}
	if(C2D2M_PrimeiroBlocoMarca(mapa, MARCA_BOLA_ESQUERDA, &x, &y))
	{
		numInimigos++;
		while(C2D2M_ProximoBlocoMarca(mapa, &x, &y))
			numInimigos++;
	}
	Ator **inimigos = (Ator**)malloc(sizeof(Ator*)*numInimigos);
	memset(inimigos, 0, numInimigos*sizeof(Ator*));
	numInimigos=0;
	if(C2D2M_PrimeiroBlocoMarca(mapa, MARCA_BOLA_DIREITA, &x, &y))
	{
		inimigos[numInimigos++]=ATOR_CriaAtor(BOLA, x, y, 0);
		while(C2D2M_ProximoBlocoMarca(mapa, &x, &y))
			inimigos[numInimigos++]=ATOR_CriaAtor(BOLA, x, y, 0);
	}
	if(C2D2M_PrimeiroBlocoMarca(mapa, MARCA_BOLA_ESQUERDA, &x, &y))
	{
		inimigos[numInimigos++]=ATOR_CriaAtor(BOLA, x, y, 180);
		while(C2D2M_ProximoBlocoMarca(mapa, &x, &y))
			inimigos[numInimigos++]=ATOR_CriaAtor(BOLA, x, y, 180);
	}
	// Coloca a música para tocar
	CA2_TocaMusica(musicas[0], -1);
	// Indica se e a primeira vez que vai tocar a musicado fim da fase
	bool primeira = false;
	while(!teclado[C2D2_ESC].pressionado && nafase)
	{
		C2D2_LimpaTela();
		// Testa as colisões
		if(ATOR_ColidiuBlocoCenario(dark, mapa, C2D2M_MORTE))
		{
			ev.tipoEvento = EVT_COLIDIU_ARMADILHA;
			ATOR_EnviaEvento(dark, &ev);
		}
		if(ATOR_ColidiuBlocoCenario(dark, mapa, C2D2M_CHECK))
		{
			ev.tipoEvento = EVT_CHECKPOINT;
			ATOR_EnviaEvento(dark, &ev);
		}
		if(ATOR_ColidiuBlocoCenario(dark, mapa, C2D2M_FIM))
		{
			ev.tipoEvento = EVT_FIM_FASE;
			ATOR_EnviaEvento(dark, &ev);
			if(!primeira)
			{
				CA2_TocaMusica(musicas[1], -1);
				primeira=true;
			}
		}
		for(int i=0;i<numInimigos;i++)
			if(inimigos[i]!=0)
				ATOR_ColidiuAtores(dark, inimigos[i]);
		// Atualiza a lógica
		ATOR_AplicaEstado(dark, mapa, LARGURA_TELA, ALTURA_TELA);
		for(int i=0;i<numInimigos;i++)
			if(inimigos[i]!=0)
				ATOR_AplicaEstado(inimigos[i], mapa, LARGURA_TELA, ALTURA_TELA);
		// Lê os controles
		ProcessaControle(dark);
		// Atualiza os personagens
		ATOR_Atualiza(dark, mapa);
		for(int i=0;i<numInimigos;i++)
			if(inimigos[i]!=0)
				if(!ATOR_Atualiza(inimigos[i], mapa))
				{
					free(inimigos[i]);
					inimigos[i]=0;
				}
		// Centraliza o mapa no personagem principal
		ATOR_CentraMapa(dark, mapa, LARGURA_TELA, ALTURA_TELA);
		// Roda os eventos do jogo
		while(ATOR_ProximoEventoJogo(&ev))
		{
			switch(ev.tipoEvento)
			{
			case EVT_FIM_FASE:
				nafase=false;
				break;
			}
		}

		// Desenha o cenário
		C2D2M_DesenhaCamadaMapa(mapa, 0, 0, 0, 640, 480);
		C2D2M_DesenhaCamadaMapa(mapa, 1, 0, 0, 640, 480);
		C2D2M_DesenhaCamadaMapa(mapa, 2, 0, 0, 640, 480);
		// DEsenha os personagens
		ATOR_Desenha(dark, mapa, 0, 0);
		for(int i=0;i<numInimigos;i++)
			if(inimigos[i]!=0)
				ATOR_Desenha(inimigos[i], mapa, 0, 0);
		// Desenha a camada mais superior
		C2D2M_DesenhaCamadaMapa(mapa, 3, 0, 0, 640, 480);
		// DEsenha as mensagens
		if((dark->estado.estado == DARK_MORRENDO || dark->estado.estado == DARK_MORREU) && dark->vidas>0)
			C2D2_DesenhaTexto(fonte, LARGURA_TELA/2, ALTURA_TELA/2, "Ops!", C2D2_TEXTO_CENTRALIZADO);
		if((dark->estado.estado == DARK_MORRENDO || dark->estado.estado == DARK_MORREU) && dark->vidas==0)
			C2D2_DesenhaTexto(fonte, LARGURA_TELA/2, ALTURA_TELA/2, "Game Over", C2D2_TEXTO_CENTRALIZADO);
		if(dark->estado.estado == DARK_VITORIA)
			C2D2_DesenhaTexto(fonte, LARGURA_TELA/2, ALTURA_TELA/2, "Fase Completa!", C2D2_TEXTO_CENTRALIZADO);

		C2D2_Sincroniza(C2D2_FPS_PADRAO);
		if(teclado[C2D2_ENTER].ativo)
			C2D2_Pausa(50);
		C2D2M_AnimaMapa(mapa);
	}
	// Apaga os personagens
	free(dark);
	for(int i=0;i<numInimigos;i++)
		if(inimigos[i]!=0)
			free(inimigos[i]);
	free(inimigos);
	// Descarrega o personagem
	ATOR_DescarregaAtor(DARKPHOENIX);
	// Apaga as imagens carregadas na memória
	C2D2_RemoveFonte(fonte);
	// Encerra os atores
	ATOR_Encerra();
	// Encerra os mapas
	C2D2M_Encerra();
	// Encerra o áudio
	CA2_Encerra();
	// Encerra a Chien2D 2
	C2D2_Encerra();
	return 0;
}
Exemple #3
0
void Shutar::CollisionHandler(){

	for (int i = 0; i < numTirosInimigos; i++)
	{
		Evento ev;
		if (ATOR_ColidiuAtores(nave, tirosInimigos[i]))
		{
			ATOR_EnviaEvento(nave, &ev);


		}

	}

	for (int i = 0; i < numinimigosBT; i++)
	{
		Evento ev;
		if (ATOR_ColidiuAtores(nave, inimigos[i]))
		{
			ATOR_EnviaEvento(nave, &ev);


		}

	}

	for (int i = 0; i < numinimigosSH; i++)
	{
		Evento ev;
		if (ATOR_ColidiuAtores(nave, inimigosSH[i]))
		{
			ATOR_EnviaEvento(nave, &ev);


		}

	}

	for (int i = 0; i < numinimigosMR; i++)
	{
		Evento ev;
		if (ATOR_ColidiuAtores(nave, inimigosMR[i]))
		{
			ATOR_EnviaEvento(nave, &ev);


		}

	}






	//trata das colisoes do tiro
	if (shootOK)
	{
		ATOR_AplicaEstado(tiro, mapa, LARGURA_TELA, ALTURA_TELA);
		Tiro_Atualiza(tiro, mapa);


		//checa colisao com bats 
		for (int i = 0; i < numinimigosBT; i++)
		{
			if (ATOR_ColidiuAtores(tiro, inimigos[i]))
			{
				Evento ev;
				ATOR_EnviaEvento(inimigos[i], &ev);
				printf("\nacertou um bat");
			}

		}

		//checa colisao com MiniShooter
		for (int i = 0; i < numinimigosSH; i++)
		{
			if (ATOR_ColidiuAtores(tiro, inimigosSH[i]))
			{
				Evento ev;
				ATOR_EnviaEvento(inimigosSH[i], &ev);
				printf("\nacertou um mshooter");
			}

		}

		//checa colisao com MiniShooter
		for (int i = 0; i < numinimigosMR; i++)
		{
			if (ATOR_ColidiuAtores(tiro, inimigosMR[i]))
			{
				Evento ev;
				ev.subtipo = TIRO_NAVE;
				ATOR_EnviaEvento(inimigosMR[i], &ev);
				printf("\nacertou um miniRed");
			}

		}




		//checa colisao tiro reboss 
		for (int i = 0; i < numinimigosRB; i++)
		{
			if (ATOR_ColidiuAtores(tiro, inimigosRB[i]))
			{
				Evento ev;
				ATOR_EnviaEvento(inimigosRB[i], &ev);
				printf("\nacertou um redboss");
			}

		}

	}//fim if tiro


	//CONFERE SE NAVE ESTA SOB AREAS DE REPARO
	for (int i = 0; i < numOcorrencias; i++)
	{
		if (ATOR_ColidiuAtores(nave, ocorrencias[i]))
		{
			Evento ev;
			nave->aux_int[3] += 150; 
		}
	}


}
Exemple #4
0
void Nave_ProcessaControle(Ator *a)
{
	int VTIRO = 3;
	int tiroType = 1;

	static Evento ev;


	C2D2_Botao *teclado = C2D2_PegaTeclas();
	C2D2_Mouse *mouse = C2D2_PegaMouse();

	
	if (teclado[C2D2_1].pressionado)
	{
		tiroType = 1; //substituir
		VTIRO = 6; //substituir 
	}
	if (teclado[C2D2_2].pressionado)
	{
		tiroType = 2;
		VTIRO = 12;
	}
	if (teclado[C2D2_3].pressionado)
	{
		tiroType = 3;
		VTIRO = 16;
	}
	if (teclado[C2D2_4].pressionado)
	{
		tiroType = 4;
		VTIRO = 30;
	}


	if (teclado[C2D2_ESPACO].ativo)
	{
		if (a->aux_int[3] > 100 )
		{
			ev.tipoEvento = EVT_PRESSIONOU_BOTAO1;
			ATOR_EnviaEvento(a, &ev);
		}
		else{
			ev.tipoEvento = EVT_LIBEROU_BOTAO1;
			ATOR_EnviaEvento(a, &ev);

		}

	}

	if (teclado[C2D2_ESPACO].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_BOTAO1;
		ATOR_EnviaEvento(a, &ev);
	}



	//GERA TIRO 
	if (mouse->botoes[0].pressionado)
	{
		if (a->aux_int[3] > 200)
		{
			ev.tipoEvento = EVT_PRESSIONOU_BOTAO3;
			ATOR_EnviaEvento(a, &ev);
		}
	}



	//GERA BOMBA
	//if (mouse->botoes[1].pressionado)
		if (teclado[C2D2_B].pressionado)
		{
		if (a->aux_int[3] > 200)
		{
			ev.tipoEvento = EVT_PRESSIONOU_BOTAO4;
			ATOR_EnviaEvento(a, &ev);
		}
	}


	/*freio nave */
	if (mouse->botoes[1].pressionado)
	//if (teclado[C2D2_LSHIFT].pressionado)


	{
		ev.tipoEvento = EVT_PRESSIONOU_BOTAO2;
		ATOR_EnviaEvento(a, &ev);

	}

	if (mouse->botoes[1].liberado)
	//if (teclado[C2D2_LSHIFT].liberado)
	{
		ev.tipoEvento = EVT_LIBEROU_BOTAO2;
		ATOR_EnviaEvento(a, &ev);
		
	}



	// Manda a posição do mouse
	int x1 = 0;
	int y1 = 0;
	C2D2M_PosicaoXY(1, &x1, &y1);
	ev.tipoEvento = EVT_POSICAO;
	ev.x = x1 + mouse->x + 12;
	ev.y = y1 + mouse->y + 12;
	ATOR_EnviaEvento(a, &ev);



}
Exemple #5
0
void Shutar::Update(int gamestate)
{
	//AQUI FICAM AS REGRAS DO JOGO
	C2D2_Botao* teclas = C2D2_PegaTeclas();
	C2D2_Mouse* mouse = C2D2_PegaMouse();

	if (gamestate == 1)
	{
		if (teclas[C2D2_ENTER].pressionado){ GameState = 2; CA2_FadeMusica(2); tocandomusica = false; }
		if (teclas[C2D2_C].pressionado){ GameState = 3; CA2_FadeMusica(2); tocandomusica = false; }

		if (teclas[C2D2_ESC].pressionado){ GameState = 10; }
	}

	if (gamestate == 3)
	{
		if (teclas[C2D2_ESC].pressionado){ GameState = 1; }
	}

	if (gamestate == 4)
	{
		if (teclas[C2D2_ESC].pressionado){ GameState = 10; }
	}


	if (gamestate == 2)
	{
		if (teclas[C2D2_ESC].pressionado){ GameState = 1; tocandomusica = false; }


		mousePosX = mouse->x;
		mousePosY = mouse->y;

		//REPASSA A POSICAO DA NAVE PARA TODOS OS INIMIGOS *-*-*-*-*-*
		int posXNave, posYNave;
		posXNave = nave->x;
		posYNave = nave->y;

		for (int i = 0; i < numinimigosSH; i++)
		{
			Evento evt;
			evt.tipoEvento = EVT_POSICAO;
			evt.x = posXNave;
			evt.y = posYNave;
			ATOR_EnviaEvento(inimigosSH[i], &evt);
			//printf("passou coordenada");
		}


			for (int i = 0; i < numinimigosMR; i++)
			{
				Evento evt;
				evt.tipoEvento = EVT_POSICAO;
				evt.x = posXNave;
				evt.y = posYNave;
				ATOR_EnviaEvento(inimigosMR[i], &evt);
			//printf("passou coordenada");
			}

			for (int i = 0; i < numinimigosBT; i++)
			{
				Evento evt;
				evt.tipoEvento = EVT_POSICAO;
				evt.x = posXNave;
				evt.y = posYNave;
				ATOR_EnviaEvento(inimigos[i], &evt);
				//printf("passou coordenada");
			}


			for (int i = 0; i < numinimigosRB; i++)
			{
				Evento evt;
				evt.tipoEvento = EVT_POSICAO;
				evt.x = posXNave;
				evt.y = posYNave;
				ATOR_EnviaEvento(inimigosRB[i], &evt);
				//printf("passou coordenada");
			}




		 //-*-*--*-*-*-*-*-*-*-*-*-*-*-*-


		//controle jogador

			Nave_ProcessaControle(nave);

		//atualiza nave 
			ATOR_AplicaEstado(nave, mapa, LARGURA_TELA, ALTURA_TELA);
			Nave_Atualiza(nave, mapa);


			// atualiza  as inimigos RB
			for (int i = 0; i < numinimigosRB; i++)
		{	
				ATOR_AplicaEstado(inimigosRB[i], mapa, LARGURA_TELA, ALTURA_TELA);
				// Aplica o estado da propulsao
				ATOR_Atualiza(inimigosRB[i], mapa);
			}

			// atualiza  as inimigos 
			for (int i = 0; i < numinimigosBT; i++)
			{
				ATOR_AplicaEstado(inimigos[i], mapa, LARGURA_TELA, ALTURA_TELA);
				ATOR_Atualiza(inimigos[i], mapa);
			}

			// atualiza  as inimigos MSHOOTER
			for (int i = 0; i < numinimigosSH; i++)
			{
				ATOR_AplicaEstado(inimigosSH[i], mapa, LARGURA_TELA, ALTURA_TELA);
				ATOR_Atualiza(inimigosSH[i], mapa);
			}



			for (int i = 0; i < numTirosInimigos; i++){
				if (tirosInimigos[i] != 0)
				{
					ATOR_AplicaEstado(tirosInimigos[i], mapa, LARGURA_TELA, ALTURA_TELA);
					ATOR_Atualiza(tirosInimigos[i], mapa);
				}
				

					if (!ATOR_Atualiza(tirosInimigos[i], mapa))
					{
						free(tirosInimigos[i]);
						tirosInimigos[i] = 0;
					}
			}


			// atualiza  as inimigos 
			for (int i = 0; i < numinimigosMR; i++)
			{
				ATOR_AplicaEstado(inimigosMR[i], mapa, LARGURA_TELA, ALTURA_TELA);
				// Aplica o estado da propulsao
				ATOR_Atualiza(inimigosMR[i], mapa);
			}


			// atualiza  as ocorrencias 
			for (int i = 0; i < numOcorrencias; i++)
			{
				ATOR_AplicaEstado(ocorrencias[i], mapa, LARGURA_TELA, ALTURA_TELA);
				// Aplica o estado da propulsao
				ATOR_Atualiza(ocorrencias[i], mapa);
			}


			//atualiza bomba 
			if (bomba != 0)
			{
				ATOR_AplicaEstado(bomba, 1, LARGURA_TELA, ALTURA_TELA);
				Tiro_Atualiza(bomba, 1);

			}
			if (!ATOR_Atualiza(bomba, 1))
			{
				free(bomba);
				bomba = 0; 

			}



			CollisionHandler(); 

			
		//eventos diretos da chien para o jogo 
			Evento ev;

			while (ATOR_ProximoEventoJogo(&ev))
			{
				switch (ev.tipoEvento)
				{

				case SUBEVT_FIM_FASE_DERROTA:
					GameState = 4; 
					break; 

				case	EVT_PRESSIONOU_BAIXO:
					shootOK = false;
					tiro = 0;
					free(tiro);
					break;

				case	EVT_PRESSIONOU_CIMA:
					BombaOK = false;
					break;

					case EVT_CRIA_PERSONAGEM:
						switch (ev.subtipo)
						{
						case TIRO_NAVE:
							// Se o tiro é nulo, pode criar um novo
							if (!shootOK)
							{
								printf("atirou!\n");
								tiro = ATOR_CriaAtor(TIRO_NAVE, ev.x, ev.y, ev.valor);
								ATOR_TocaEfeitoTela(nave, 0, mapa);
								shootOK = true;
							}

							break;

						case BOMBA:
							// Se o tiro é nulo, pode criar um novo
							if (!BombaOK)
							{
								printf("BOMBA!\n");
								bomba = ATOR_CriaAtor(BOMBA, ev.x, ev.y, ev.valor);
								ATOR_TocaEfeitoTela(nave, 2, mapa);
								BombaOK = true;
							}

							break;


						case REDBOSS:
							// Se o tiro é nulo, pode criar um novo
							if (redboss == 0)
								redboss = ATOR_CriaAtor(REDBOSS, ev.x, ev.y, ev.valor);
							break;

						case MINIRED:
							// Se o tiro é nulo, pode criar um novo
							printf("\ngerador recebeu a info e vai gerar um MiniRED");
							miniredAgenger = ATOR_CriaAtor(MINIRED, ev.x, ev.y, ev.valor);
					
							break;

						case TIRO_INIMIGO:
						{
							// Se o tiro é nulo, pode criar um novo


							for (int i = 0; i < numTirosInimigos; i++)
							{
								if (tirosInimigos[i] == 0)
								{
									printf("atirou!\n");
										tirosInimigos[i] = ATOR_CriaAtor(TIRO_INIMIGO, ev.x, ev.y, ev.valor);
									ATOR_TocaEfeitoTela(nave, 0, mapa);
									break;

								}
							} //fim for

						}


						}
						break;
					}
			}
	} //fim gamestate 2


}