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; }
int action_loop_menu(MENU_ITEM *self) { MENU *m=(MENU*)self->user_data; loop_menu(m); return 0; }