int main (int argc, char ** argv){ menu_inicial(); glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(400, 400); glutCreateWindow ("Calculo Numerico (c) Edson L. Araujo"); glutCreateMenu (MyRightMenu); glutAddMenuEntry ("Clear", 1); glutAddMenuEntry ("Exit", 2); glutAddMenuEntry ("Start", 3); glutAddMenuEntry ("Antialiasing",9); glutAddMenuEntry ("-Forma de Lagrange (vermelho)",21); glutAddMenuEntry ("-Spline Cubica Natural (azul)",22); glutAddMenuEntry ("-As duas ao mesmo tempo (experimental)",23); glutAttachMenu (GLUT_RIGHT_BUTTON); glutDisplayFunc ( myDisplayFunc ); glutMouseFunc ( myMouseFunc ); glutMotionFunc ( myMotionFunc ); glutKeyboardFunc( myKeyboardFunc ); glutReshapeFunc ( myReshapeFunc ); Picker.SetBuffer(); glutMainLoop(); return 0; }
int main(int argc, char *argv[]) { int a; menu_inicial(&a); opcao_usuario(&a); return 0; }
int main() { init(); // inicializa /* ####################################################################################### declaração das variáveis (e algumas inicializações) ####################################################################################### */ int i,j; // controladores de loops e auxiliares int ticks; // controla velocidade do jogo int tempo_de_jogo=0; // controla o tempo de jogo int matriz_tela[ALTURA_MAPA/32][LARGURA_MAPA/32]; // matriz da tela int ajuste_mapa = 0; // variavel que cuida do movimento do mapa e dos objetos nele int tela = 0, selecionar = 0; //controla o carregamento de cada tela int tela_destino=1; // determina qual tela será carregada após a tela de carregamento int fase=1; int carrega_fase=1; char nome_fase[N_FASES][10]={"mapa1.txt","mapa2.txt","mapa3.txt"}; int loading_time = 0; int estagio_loading=0; int bloqueios[3] = {TERRA, PEDRA, CHAO}; int pause = 0; int tocando=0; int tocando_game_over=0; int tutorial=1; // abrindo os datafiles DATAFILE* graficos = NULL; DATAFILE* musicas = NULL; DATAFILE* efeitos = NULL; DATAFILE* fontes = NULL; packfile_password("kill"); graficos = load_datafile("imagens.dat"); musicas = load_datafile("musicas.dat"); efeitos = load_datafile("efeitos.dat"); fontes = load_datafile("fontes.dat"); packfile_password(NULL); // variáveis de objetos Tjanelas janelas; Tcriatura guerreiro; // declara objeto guerreiro Toponentes inimigos; Titens itens; Teventos eventos; // declara BITMAPS BITMAP *buffer = create_bitmap(SCREEN_W,SCREEN_H); // Cria o buffer; BITMAP *mapa = create_bitmap(LARGURA_MAPA,ALTURA_MAPA); // Cria o mapa BITMAP *texturas[MAX_TERRENOS]; // declara a array de texturas BITMAP *background = create_bitmap(960,480); //BITMAPs do Menu BITMAP *menu_iniciar = (BITMAP*) graficos[MENU_1].dat;//menu iniciar BITMAP *menu_creditos = (BITMAP*) graficos[MENU_3].dat; BITMAP *menu_options = (BITMAP*) graficos[MENU_2].dat;//menu opções BITMAP *menu_exit = (BITMAP*) graficos[MENU_4].dat;//menu saída BITMAP *logo = (BITMAP*) graficos[LOGO_1].dat; // BITMAPS da tela de carregamento BITMAP *tela_loading[4]; tela_loading[0] = (BITMAP*) graficos[CARREGAR_1].dat; tela_loading[1] = (BITMAP*) graficos[CARREGAR_2].dat; tela_loading[2] = (BITMAP*) graficos[CARREGAR_3].dat; tela_loading[3] = (BITMAP*) graficos[CARREGAR_4].dat; // Declara fontes FONT* corpo_texto = (FONT*) fontes[CORPO_TEXTO].dat; FONT* titulo_texto = (FONT*) fontes[TITULO_TEXTO].dat; // Declara sons MIDI* musica_floresta = (MIDI*) musicas[MUSICA_FLORESTA].dat; MIDI* musica_caverna = (MIDI*) musicas[MUSICA_CAVERNA].dat; MIDI* musica_chefe1 = (MIDI*) musicas[MUSICA_CHEFE_1].dat; MIDI* musica_chefe2 = (MIDI*) musicas[MUSICA_CHEFE_2].dat; MIDI* musica_chefe3 = (MIDI*) musicas[MUSICA_CHEFE_3].dat; MIDI* musica_menu = (MIDI*) musicas[MUSICA_MENU].dat; MIDI* musica_gameover = (MIDI*) musicas[MUSICA_GAMEOVER].dat; SAMPLE* selecao = (SAMPLE*) efeitos[SELECIONAR].dat; SAMPLE* confirmar = (SAMPLE*) efeitos[CONFIRMAR].dat; SAMPLE* espada = (SAMPLE*) efeitos[ESPADA].dat; SAMPLE* besta = (SAMPLE*) efeitos[BESTA].dat; SAMPLE* som_pause = (SAMPLE*) efeitos[PAUSE].dat; SAMPLE* som_dano_goblin = (SAMPLE*) efeitos[DANO_GOBLIN].dat; SAMPLE* som_dano_guerreiro = (SAMPLE*) efeitos[DANO_HEROI].dat; SAMPLE* som_cura = (SAMPLE*) efeitos[CURA].dat; SAMPLE* som_vinhas = (SAMPLE*) efeitos[PARALISIA].dat; SAMPLE* som_recuo = (SAMPLE*) efeitos[RECUO].dat; volume=250; set_volume(volume,volume); /* ####################################################################################### fim da declaração das variáveis ####################################################################################### */ // configura saída com o botão x no alto da tela exit_program = FALSE; LOCK_FUNCTION(fecha_programa); LOCK_VARIABLE(exit_program); set_close_button_callback(fecha_programa); // fecha a qualquer momento com o botão fechar // timer timer=0; LOCK_FUNCTION(incrementa_timer); LOCK_VARIABLE(timer); install_int_ex(incrementa_timer,BPS_TO_TIMER(60)); // para que o jogo execute 60 vezes por segundo ticks = timer; // velocidade do jogo // Processo de repetição principal while (!exit_program) { // loop válido, executado 60 vezes por segundo while(ticks<=timer && !exit_program) { // tela de menu if(tela==0) { clear_bitmap(buffer); keyboard_input(); menu_inicial(buffer, &selecionar, menu_iniciar, menu_options, menu_exit,menu_creditos,&loading_time, &tela, &estagio_loading,&tela_destino,&fase,&carrega_fase,&tempo_de_jogo,selecao,confirmar,&tocando, musica_menu); } // tela de loading else if (tela == 9) { clear_bitmap(buffer); tela_carregamento(buffer, tela_loading, &loading_time,tela_destino, &tela,logo); carrega_elementos_fase(&carrega_fase,&estagio_loading,matriz_tela,nome_fase,fase,&itens,&guerreiro,&inimigos, &janelas,background,texturas,&eventos,mapa,graficos); } // tela de jogo else if(tela==1) { // toca a musica da fase se não estiver tocando tocar(&tocando,fase,musica_floresta,musica_caverna); // atualiza estado do teclado keyboard_input(); pausar(&pause,&selecionar,som_pause); // verifica se pressionou pause // limpa bitmaps de armazenamento clear_bitmap(buffer); // Limpa o buffer; clear_bitmap(guerreiro.sprite); // Limpa bitmap guerreiro clear_bitmap(inimigos.goblins_guerreiros.goblins[0].sprite); // Limpa bitmap goblin tipo 1 clear_bitmap(inimigos.goblins_guerreiros.goblins[1].sprite); // Limpa bitmap goblin tipo 1 if (!pause) // pause pode travar toda a lógica e tempo de jogo, exceto os eventos { // incrementa o tempo de jogo tempo_de_jogo++; // Lógica do jogo tocou_oponente(&guerreiro,&inimigos,tempo_de_jogo,som_dano_guerreiro); verificar_status(&guerreiro,&inimigos,tempo_de_jogo,&itens); movimento_guerreiro(&guerreiro,matriz_tela, bloqueios,som_recuo); ataque_guerreiro(&guerreiro,tempo_de_jogo,&inimigos,espada,som_dano_goblin); calcular_ajuste_mapa(&guerreiro,&ajuste_mapa); acoes_goblins(&inimigos,&guerreiro,tempo_de_jogo,matriz_tela,bloqueios,&itens,espada,besta,som_dano_guerreiro, som_vinhas); verifique_efeito_item(&itens,&guerreiro,&inimigos,tempo_de_jogo,som_dano_guerreiro,som_cura); movimento_itens(&itens,&guerreiro,tempo_de_jogo,matriz_tela,bloqueios); } verificar_evento(&pause,fase,&eventos,&guerreiro,&janelas,matriz_tela,bloqueios,&ajuste_mapa,musica_chefe1, musica_chefe2,musica_chefe3,confirmar); // Desenhar draw_sprite(buffer,background,ajuste_mapa/10,0); draw_sprite(buffer, mapa, ajuste_mapa, 0); // manda mapa para o buffer na posição mov_mapa desenhar_todos_goblins(&inimigos,buffer,ajuste_mapa,tempo_de_jogo); desenhar_guerreiro(buffer,&guerreiro,&inimigos,ajuste_mapa,tempo_de_jogo,graficos); // desenha guerreiro e manda para buffer desenhar_itens(buffer,&itens,ajuste_mapa); desenhos_evento(buffer,fase,&eventos,&janelas,&guerreiro,corpo_texto,titulo_texto,&inimigos); pause_menu(&pause,&eventos,buffer,&selecionar,&tela,tempo_de_jogo,&tela_destino,&loading_time, selecao,confirmar,&tocando); game_over(&pause,&eventos,buffer,&selecionar,&tela,tempo_de_jogo,&tela_destino,&loading_time,selecao,confirmar, &tocando,musica_gameover,&guerreiro,&estagio_loading,&tocando_game_over,&carrega_fase,graficos); // se inicio da fase, coloca um efeito de opacidade efeito_inicio_fase(&eventos,&pause,buffer,graficos,confirmar,fase,&tutorial); // nova fase? verifica_nova_fase(&guerreiro,&fase,&carrega_fase,&tela,&loading_time,&estagio_loading,&tela_destino, &inimigos.chefes,&eventos,&tocando,&pause,buffer); blit(buffer,screen,0,0,0,0,LARGURA_SCREEN,ALTURA_SCREEN); // Manda o buffer para a tela; } // tela de opçções else if(tela==2) { clear_bitmap(buffer); keyboard_input(); menu_opcoes(buffer,graficos,selecao,confirmar,&tela); } // tela de créditos else if(tela==3) { clear_bitmap(buffer); keyboard_input(); creditos(buffer,graficos,confirmar,&tela); } else if(tela==4) { clear_bitmap(buffer); keyboard_input(); final_de_jogo(buffer,graficos,&tela,confirmar); } ticks++; // incrementa controle de velocidade do jogo } } deinit(); // finaliza // destruição de bitmaps destroy_bitmap(buffer); destroy_bitmap(mapa); destroy_bitmap(background); for(i=0;i<MAX_TERRENOS;i++) destroy_bitmap(texturas[i]); destroy_bitmap(guerreiro.sprite); for(i=0;i<8;i++) destroy_bitmap(guerreiro.vetor_sprite[i]); for(i=0;i<10;i++) destroy_bitmap(guerreiro.barraHp[i]); for(i=0;i<8;i++) { for(j=0;j<6;j++) destroy_bitmap(inimigos.goblins_guerreiros.goblins[j].vetor_sprite[i]); if(i!=7) { for(j=0;j<6;j++) destroy_bitmap(inimigos.goblins_arqueiros.goblins[j].vetor_sprite[i]); } destroy_bitmap(inimigos.chefes.chefe[0].vetor_sprite[i]); } for(i=0;i<6;i++) { destroy_bitmap(inimigos.goblins_guerreiros.goblins[i].sprite); destroy_bitmap(inimigos.goblins_arqueiros.goblins[i].sprite); } destroy_bitmap(inimigos.chefes.chefe[0].sprite); for(i=0;i<8;i++) { destroy_bitmap(itens.todosItens[i].imagem); destroy_bitmap(itens.todosItens[i].imagem_buffer); } return 0 ; }
void main() { allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 1000, 600, 0, 0); install_int_ex(ContaMsec, MSEC_TO_TIMER(1)); install_int_ex(ContaSec, SECS_TO_TIMER(1)); install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,NULL); MIDI* bgSound = load_midi("sounds/BGM.mid"); SAMPLE* snakeHit = load_wav("sounds/cobraDamage.wav"); SAMPLE* snakeHitSelf = load_wav("sounds/cobraDamage2.wav"); SAMPLE* snakeDeath = load_wav("sounds/cobraDeath.wav"); SAMPLE* gameOver = load_wav("sounds/gameOver.wav"); InicializaPP(); int swt = 0; struct Cobra snake[500]; //Estrutura que representa a cobra e suas bmpPartes. int xst=0, yst=10, xst2=190, yst2 = 40; //Coordenadas de referência da área de Status do jogo int xL = 0, yL = 425, xL2 = 190, yL2 = 590; //Coordenadas de referência da Tabela de Comidas buffer = create_bitmap(800,600); //Bitmap principal de desenho status = create_bitmap(200,600); //Bitmap principal de desenho clear_to_color(status, makecol(0,0,0)); clear_to_color(buffer, makecol(0,0,0)); //INICIO: Inicializacao Sprites bmpSapo = load_bitmap("images/sapo_20x20.bmp",pallet); bmpAranha = load_bitmap("images/ARANHA_20X20.bmp",pallet); bmpMaca = load_bitmap("images/MACA_20x20.bmp",pallet); bmpMilho = load_bitmap("images/milho_20X20.bmp",pallet); bmpCobraHead = load_bitmap("images/cobraHeadVerde.bmp",pallet); bmpFundo = load_bitmap("images/fundoAreia.bmp",pallet); bmpCobrinha = load_bitmap("images/cobrinha.bmp",pallet); bmpParte = load_bitmap("images/cobraCorpo2.BMP",pallet); bmpBordaVert = load_bitmap("images/bordaVert.bmp",pallet); bmpBordaHoriz = load_bitmap("images/bordaHoriz.bmp",pallet); myfont = load_font("Terminal.pcx", pallet, NULL); //Fonte personalizada //FIM: Inicializacao Sprites //INICIO: Comidas Comida cmdSapo; cmdSapo.x = 300; cmdSapo.y = 400; cmdSapo.bmp = bmpSapo; cmdSapo.spStand = load_wav("sounds/sapoStand.wav"); cmdSapo.spDie = load_wav("sounds/sapoDie.wav"); cmdSapo.visible = true; cmdSapo.ponto = 50; cmdSapo.taman = 1; Comida cmdAranha; cmdAranha.x = 60; cmdAranha.y = 500; cmdAranha.bmp = bmpAranha; cmdAranha.spStand = load_wav("sounds/sapoStand.wav"); cmdAranha.spDie = load_wav("sounds/aranhaDie.wav"); cmdAranha.visible = true; cmdAranha.ponto = 30; cmdAranha.taman = 3; Comida cmdMaca; cmdMaca.x = 100; cmdMaca.y = 100; cmdMaca.bmp = bmpMaca; cmdMaca.spStand = load_wav("sounds/sapoStand.wav"); cmdMaca.spDie = snakeBit; cmdMaca.visible = true; cmdMaca.ponto = 20; cmdMaca.taman = 4; Comida cmdMilho; cmdMilho.x = 600; cmdMilho.y = 100; cmdMilho.bmp = bmpMilho; //cmdmilho.spStand = load_wav("sounds/sapoStand.wav"); cmdMilho.spDie = snakeBit; cmdMilho.visible = true; cmdMilho.ponto = 10; cmdMilho.taman = 5; Comida cmdCobrinha; cmdCobrinha.x = 600; cmdCobrinha.y = 480; cmdCobrinha.bmp = bmpCobrinha; cmdCobrinha.spStand = load_wav("sounds/cobrinhaStand.wav"); cmdCobrinha.spDie = load_wav("sounds/cobrinhaDie.wav"); cmdCobrinha.visible = true; cmdCobrinha.ponto = 40; cmdCobrinha.taman = 2; Comida comidas[20]; comidas[0] = cmdSapo; comidas[1] = cmdAranha; comidas[2] = cmdMaca; comidas[3] = cmdMilho; comidas[4] = cmdCobrinha; comidas[5] = cmdAranha; comidas[6] = cmdMilho; comidas[7] = cmdMilho; comidas[8] = cmdMilho; comidas[9] = cmdCobrinha; comidas[10] = cmdSapo; comidas[11] = cmdAranha; comidas[12] = cmdMaca; comidas[13] = cmdMilho; comidas[14] = cmdCobrinha; comidas[15] = cmdAranha; comidas[16] = cmdMilho; comidas[17] = cmdMilho; comidas[18] = cmdMilho; comidas[19] = cmdCobrinha; //FIM: Comidas Vida vidas[6]; for (int i = 0;i < 6; i++){ vidas[i].x = i*30; vidas[i].y = 0; vidas[i].bmp = bmpCobraHead; vidas[i].visible = true; } //INICIO: Desenho da área de status do jogo. Pontos, Fase, Tamanho, Tempo, Vidas for (int i = -1;i<2;i++){rect(status, xst+i, yst+i, xst2-i, 40-i, makecol(210,192,152));} textprintf_ex(status, myfont, xst+5,68, makecol(255,0,0), -1,"Fase: 1" ); for (int i = -1;i<2;i++){rect(status, xst+i, yst+50+i, xst2-i, yst2+50-i, makecol(210,192,152));} for (int i = -1;i<2;i++){rect(status, xst+i, yst+100+i, xst2-i, yst2+100-i, makecol(210,192,152));} for (int i = -1;i<2;i++){rect(status, xst+i, yst+150+i, xst2-i, yst2+150-i, makecol(210,192,152));} for (int i = 0;i < 6; i++){ if (vidas[i].visible){ draw_sprite(status, vidas[i].bmp, vidas[i].x, vidas[i].y+195); } } //FIM: Desenho da área status do jogo. Pontos, Fase, Tamanho, Tempo, Vidas //INICIO: Desenho da Tabela de Comida do jogo. textprintf_ex(status, myfont, xL,yL-20, makecol(255,0,0 ), -1,"Comidas" ); for (int i = -1;i<2;i++){rect(status, xL+i, yL+i, xL2-i, yL2-i, makecol(210,192,152));} draw_sprite(status, bmpMilho, xL+10, yL+10); textprintf_ex(status, font, xL+40,yL+20, makecol(255,255,0 ), -1,"10 pontos" ); draw_sprite(status, bmpMaca, xL+10, yL+40); textprintf_ex(status, font, xL+40,yL+50, makecol(255,0,0 ), -1,"20 pontos" ); draw_sprite(status, bmpAranha, xL+10, yL+70); textprintf_ex(status, font, xL+40,yL+80, makecol(153,0,255 ), -1,"30 pontos" ); draw_sprite(status, bmpCobrinha, xL+10, yL+100); textprintf_ex(status, font, xL+40,yL+110, makecol(255,255,153 ), -1,"40 pontos" ); draw_sprite(status, bmpSapo, xL+10, yL+130); textprintf_ex(status, font, xL+40,yL+140, makecol(110,220,0 ), -1,"50 pontos " ); //FIM: Desenho da Tabela de Comida do jogo. //INICIO: Desenho do campo de ação da cobra. draw_sprite(buffer, bmpFundo, xC,yC); draw_sprite(buffer, bmpBordaVert, xC,yC); draw_sprite(buffer, bmpBordaVert, xC2-20,yC); draw_sprite(buffer, bmpBordaHoriz, xC,xC); draw_sprite(buffer, bmpBordaHoriz, xC,yC2-20); //FIM: Desenho do campo de ação da cobra //INICIO: Desenho da cobra snake[0].bmp = bmpCobraHead; for (int i = 1;i<tamCobra;i++){ snake[i].bmp = bmpParte; } //FIM: Desenho da cobra char control; int veloc; control = menu_inicial(); if (control == 'j'){veloc = 120;}else{veloc = 50;} play_midi(bgSound,0); draw_sprite(screen,status,800,0); DesenhaCampoAcao(); int x=20, y=20 , xx, yy; int dirx = 20, diry = 0; int tipoCol = 0; int tamComida; //Tamanho que a comida capturada aumentará a cobra int ptsComida; //Quantidade de pontos que a comida vale int pontosAtual = 0; //Quantidade de pontos while (!key[KEY_ESC]) { DesenhaCampoAcao(); if(control == 't'){ if (key[KEY_UP]){ if (dirx != 0) { diry = -20; dirx = 0; } } if (key[KEY_DOWN]){ if (dirx != 0) { diry = 20; dirx = 0; } } if (key[KEY_LEFT]){ if (diry != 0) { dirx = -20; diry = 0; } } if (key[KEY_RIGHT]){ if (diry != 0) { dirx = 20; diry = 0; } } } else if(control = 'j') { swt = inp32(0x379); if (swt == 95){ if ((countMsecCmd / 100) > 1){ if (dirx == 20 && diry == 0) { diry = 20; dirx = 0; } else if (dirx == 0 && diry == 20) { dirx = -20; diry = 0; } else if (dirx == -20 && diry == 0) { diry = -20; dirx = 0; } else if (dirx == 0 && diry == -20) { dirx = 20; diry = 0; } countMsecCmd = 0; } } if (swt == 63){ if ((countMsecCmd / 100) > 1){ if (dirx == 0 && diry == 20) { diry = 0; dirx = 20; } else if (dirx == 20 && diry == 0) { dirx = 0; diry = -20; } else if (dirx == 0 && diry == -20) { diry = 0; dirx = -20; } else if (dirx == -20 && diry == 0) { dirx = 0; diry = 20; } countMsecCmd = 0; } } } if ((countMsec / veloc) > 1){ x += dirx; y += diry; if (VerifCollision(snake, comidas, x, y, &xx, &yy, tamCobra, &tipoCol, &ptsComida, &tamComida)){ switch (tipoCol){ case 0: break; case 1://colisao com corpo textprintf_ex(screen, font, 0,560, makecol(255,0,0 ), -1,"Colisao Em : x: %d y: %d TipoCol: %d", xx, yy, tipoCol); tipoCol = 0; ResetaPosicaoCobra(snake, tamCobra); play_sample(snakeHitSelf,255,90,1000,0); if (qtdVidas > 1){qtdVidas=0;} else {qtdVidas = -1;} MostraVidas(qtdVidas,vidas); x=20; y=20; dirx = 20; diry = 0; AcendeLuzes(); break; case 2://colisao obstaculos textprintf_ex(screen, font, 0,560, makecol(255,0,0 ), -1,"Colisao Em : x: %d y: %d TipoCol: %d", xx, yy, tipoCol); tipoCol = 0; ResetaPosicaoCobra(snake, tamCobra); play_sample(snakeHit,255,90,1000,0); qtdVidas--; MostraVidas(qtdVidas,vidas); x=20; y=20; dirx = 20; diry = 0; AcendeLuzes(); break; case 3: //colisao comida textprintf_ex(screen, font, 0,560, makecol(255,0,0 ), -1,"Colisao Em : x: %d y: %d TipoCol: %d", xx, yy, tipoCol); AumentaCobra(snake, &tamCobra, tamComida, bmpParte); pontosAtual += ptsComida; tipoCol = 0; CriaComida(comidas); break; } } MoveSnake(snake, x, y, tamCobra); MostraStatus(pontosAtual, tamCobra); draw_sprite(screen,status,800,0); countMsec = 0; for (int i = 0;i < tamCobra;i++){ draw_sprite(buffer, snake[i].bmp, snake[i].x,snake[i].y); } for (int i = 0;i < 10;i++){ if (comidas[i].visible){ draw_sprite(buffer, comidas[i].bmp, comidas[i].x,comidas[i].y); } } draw_sprite(screen,buffer,0,0); IntercalaLeds(); } else if(qtdVidas < 0) { play_sample(snakeDeath,255,90,1000,0); stop_midi(); play_sample(gameOver,255,90,1000,0); GravaRank(pontosAtual, countSec, tamCobra); clear_to_color(buffer, makecol(165,229,101)); clear_to_color(screen, makecol(165,229,101)); MostraRank(); textprintf_ex(buffer, myfont, 300,500, makecol(255,0,0), -1,"Aperte ESC para sair...." ); draw_sprite(screen,buffer,0,0); break; } } while (!key[KEY_ESC]) {} FinalizaPP(); }