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; }
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; }
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; }