Пример #1
0
void move_player_com_inercia (Player* player, DIRECAO direcao) {
	if (direcao == PARADA) {
		if (player->velocidade > 0)
			player->velocidade -= 3;
		else if(player->velocidade < 0)
			player->velocidade += 3;      
	}

	else if (player->direcao_atual == direcao)
		player->velocidade += direcao;
	else 
		player->velocidade -= 10*direcao;

	if (player->velocidade > 25) 
		player->velocidade = 25;
	else if (player->velocidade < -25)
		player->velocidade = -25;

	player->direcao_atual = direcao;
	player->posicao_x += player->velocidade/5;

	if (get_posicao_x_max_player(player) > LARGURA_DISPLAY - BARREIRA_LATERAL_DISPLAY)
		player->posicao_x = LARGURA_DISPLAY - BARREIRA_LATERAL_DISPLAY - player->delta_x;

	if (get_posicao_x_min_player(player) < 0 + BARREIRA_LATERAL_DISPLAY)
		player->posicao_x = BARREIRA_LATERAL_DISPLAY + player->delta_x;
}
Пример #2
0
bool verifica_se_ponto_dentro (float x, float y, Player* player) {
	float coordenada_1[2]= {get_posicao_x_min_player(player), get_posicao_y_max_player(player)};
	float coordenada_2[2]= {get_posicao_x_max_player(player), get_posicao_y_max_player(player)};
	float coordenada_3[2]= {get_posicao_x_min_player(player) + player->delta_x, get_posicao_y_min_player(player)};
	float coordenada_4[2]= {x, y};

	if (calcular_area(coordenada_1, coordenada_2, coordenada_3) == calcular_area(coordenada_1, coordenada_2, coordenada_4)
															     + calcular_area(coordenada_1, coordenada_3, coordenada_4)
														   	     + calcular_area(coordenada_2, coordenada_3, coordenada_4))
		return true;
	else
		return false;
}
Пример #3
0
bool loop_de_jogo (Jogo* jogo) {
    al_start_timer(jogo->timer);
    bool doexit = false;
    bool redraw = true;

    while (!doexit) {
        ALLEGRO_EVENT ev;
        al_wait_for_event(jogo->event_queue, &ev);

		if (ev.type == ALLEGRO_EVENT_TIMER) {
        	redraw = true;
    
            if (jogo->key[KEY_LEFT] && get_posicao_x_min_player(&jogo->player) > 0 + BARREIRA_LATERAL_DISPLAY)
                move_player(&jogo->player, ESQUERDA);

            if (jogo->key[KEY_RIGHT] && get_posicao_x_max_player(&jogo->player) < jogo->largura - BARREIRA_LATERAL_DISPLAY)
                move_player(&jogo->player, DIREITA);
 
            if (jogo->key[KEY_ESCAPE] && jogo->loop_count_menu_pause > 1) {
                inicializa_menus(&jogo->menu);
                doexit = loop_menu(&jogo->menu, &jogo->hud, PAUSE);
                jogo->key[KEY_Z] = false;
                jogo->loop_count_menu_pause = 0;
            }

            if (jogo->key[KEY_Z]
                && jogo->loop_count_projetil > jogo->player.projetil_cooldown
                && jogo->loop_count_menu_pause > 1) {
                jogo->loop_count_projetil = 0;
                cria_projetil(&jogo->projetil_stack[jogo->numero_de_projeteis],
                              get_posicao_x_centro_player(&jogo->player),
                              jogo->player.posicao_y + 10,
                              CIMA);
                jogo->numero_de_projeteis++;
            }
    	}
 
      	else if (ev.type == ALLEGRO_EVENT_KEY_DOWN) {
        	switch(ev.keyboard.keycode) {
            	case ALLEGRO_KEY_LEFT: 
            		jogo->key[KEY_LEFT] = true;
                	break;
 
            	case ALLEGRO_KEY_RIGHT:
               		jogo->key[KEY_RIGHT] = true;
               		break;

                case ALLEGRO_KEY_F1:
                    //F1 é o hard exit
                    doexit = true;
                    break;

                case ALLEGRO_KEY_ESCAPE:
                    jogo->key[KEY_ESCAPE] = true;
                    break;

            	case ALLEGRO_KEY_Z:
               		jogo->key[KEY_Z] = true;
               		break;
        }
    }

    	else if (ev.type == ALLEGRO_EVENT_KEY_UP) {
        	switch(ev.keyboard.keycode) {
            	case ALLEGRO_KEY_LEFT: 
               		jogo->key[KEY_LEFT] = false;
               		break;
 
            	case ALLEGRO_KEY_RIGHT:
               		jogo->key[KEY_RIGHT] = false;
               		break;

            	case ALLEGRO_KEY_Z:
               		jogo->key[KEY_Z] = false;
               		break;
        }
    }
 
    	if (redraw && al_is_event_queue_empty(jogo->event_queue)) {

            /*CONDIÇÕES DE VITÓRIA
            return true;
            */

            colisao_player_vs_projetil(jogo);
            colisao_alien_vs_projetil(jogo);
            colisao_mothership_vs_projetil(jogo);

            for (int i = 0; i < jogo->numero_shields; i++)
                colisao_shield_vs_projetil (jogo, &jogo->shields[i]);
            
            redraw = false;
            jogo->key[KEY_ESCAPE] = false;

            if (!(jogo->loop_alien_movement % (GAME_FPS/2+jogo->fase)))
                rota_tropa (jogo->alien, jogo);

            if (!(jogo->loop_alien_shots % (GAME_FPS/2+jogo->fase))) {
                atira_tropa (jogo->alien, &jogo->projetil_stack[jogo->numero_de_projeteis]);
                jogo->numero_de_projeteis++;
            }

            incremento_loop_elementos_jogo(jogo);

            desenha_jogo(jogo);

            al_flip_display();

            if (jogo->hud.lives < 0) {
                inicializa_menus(&jogo->menu);
                doexit = loop_menu(&jogo->menu, &jogo->hud, GAME_OVER);
            }
		}
    }

    return false;
}