void loop_eventos_jogo( Jogo* jogo ) { bool sair = false; bool seta_direita_pressionada = false, seta_esquerda_pressionada = false; while( !sair ) { if( !al_is_event_queue_empty(jogo->fila_eventos) ) { ALLEGRO_EVENT evento; al_wait_for_event( jogo->fila_eventos, &evento ); if( evento.type == ALLEGRO_EVENT_KEY_DOWN ) switch( evento.keyboard.keycode ) { case ALLEGRO_KEY_LEFT: seta_esquerda_pressionada = true; break; case ALLEGRO_KEY_RIGHT: seta_direita_pressionada = true; break; } else if( evento.type == ALLEGRO_EVENT_KEY_UP ) switch( evento.keyboard.keycode ) { case ALLEGRO_KEY_LEFT: seta_esquerda_pressionada = false; break; case ALLEGRO_KEY_RIGHT: seta_direita_pressionada = false; break; case ALLEGRO_KEY_X: sair = true; break; } } if( seta_direita_pressionada ) move_tanque_jogo( jogo, DIREITA ); else if( seta_esquerda_pressionada ) move_tanque_jogo( jogo, ESQUERDA ); else move_tanque_jogo( jogo, PARAR ); desenha_jogo( jogo ); } }
void main_loop_jogo(Jogo* jogo){ al_start_timer(jogo->timer); while(!jogo->sair){ ALLEGRO_EVENT ev; al_wait_for_event(jogo->event_queue, &ev); switch (jogo->estado_do_jogo){ case MENU_INICIAL: processa_menu(jogo, jogo->menu[MENU_PRINCIPAL], ev); if(jogo->redraw && al_is_event_queue_empty( jogo->event_queue)){ jogo->redraw = false; desenha_menu(jogo->menu[MENU_PRINCIPAL], jogo->largura, jogo->altura); } break; case PLAY: processa_jogo(jogo, ev); if(jogo->redraw && al_is_event_queue_empty( jogo->event_queue)){ jogo->redraw = false; desenha_jogo(jogo); } break; case MENU_PAUSA: processa_menu(jogo, jogo->menu[MENU_DE_PAUSA], ev); if(jogo->redraw && al_is_event_queue_empty( jogo->event_queue)){ jogo->redraw = false; desenha_menu(jogo->menu[MENU_DE_PAUSA], jogo->largura, jogo->altura); } break; case MENU_OPCOES: processa_menu(jogo, jogo->menu[MENU_DE_OPCOES], ev); if(jogo->redraw && al_is_event_queue_empty( jogo->event_queue)){ jogo->redraw = false; desenha_menu(jogo->menu[MENU_DE_OPCOES], jogo->largura, jogo->altura); } break; case GAME_OVER: break; } } }
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; }