void display(void) { if(Game_HitGround()) { // Check keyboard for reset Airplane_Keyboard(&thrust, &yawRate, &pitchRate, &rollRate, &firstPersonView, &resetFlag); Game_Over(); if(resetFlag == 1) { Game_Reset(&forward, &up, &right, &position, &velocity, &thrust, &yawRate, &pitchRate, &rollRate, &firstPersonView, &resetFlag, &camera_position, &camera_look, camMatrix); } } else { // Get user input Airplane_Keyboard(&thrust, &yawRate, &pitchRate, &rollRate, &firstPersonView, &resetFlag); // Update airplane dynamics Dynamics_CalcRot(yawRate, pitchRate, rollRate, &forward, &up, &right); Dynamics_CalcPos(thrust, &forward, &velocity, &position); // Update camera Camera_Update(firstPersonView, &forward, &up, &position, velocity, &camera_position, &camera_look, camMatrix); printError("pre display"); // clear the screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw ground and skybox World_Draw(&camera_position, &camera_look, camMatrix, &position, &up, firstPersonView); // Check for collision Game_CollisionDetection(&position, &forward, &up, &right); // The game loop Game_Loop(position); // Draw target Game_DrawTarget(camMatrix, &camera_position); // Draw airplane Airplane_Draw(&forward, &up, &right, &position, &camera_position, camMatrix); // Reset game? if(resetFlag == 1) { Game_Reset(&forward, &up, &right, &position, &velocity, &thrust, &yawRate, &pitchRate, &rollRate, &firstPersonView, &resetFlag, &camera_position, &camera_look, camMatrix); } } printError("display"); glutSwapBuffers(); }
int main(int argc, char* args[]) { // Inicializa todos os módulos do SDL SDL_Init(SDL_INIT_EVERYTHING); // Inicializa o módulo de fontes TTF_Init(); // Cria a janela _window = SDL_CreateWindow("Killer Run", 50, 50, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); //Cria o Render renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED); //Inicializa o Modulo de áudio Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096); Game_Setup(); // Inicializa configurações do jogo ////////////////////////// Loop Principal /////////////////////// while (isRunning) { globalTime = SDL_GetTicks(); SDL_RenderClear(renderer); // Limpa o render a cada frame Game_Loop(); // Loop principal do jogo SDL_RenderPresent(renderer); // Atualiza render a cada frame // Captura evento caso ao clicar no botão para fechar janela while (SDL_PollEvent(&_event)) { if (_event.type == SDL_QUIT) { isRunning = false; } } //Limita o FPS a um valor definido no #define FPS Core.h if ((1000 / FPS) >= SDL_GetTicks() - globalTime) { SDL_Delay(1000 / FPS - (SDL_GetTicks() - globalTime)); } } ///////////////////// Fim do Loop Principal /////////////////////// SDL_DestroyWindow(_window); SDL_DestroyRenderer(renderer); Mix_CloseAudio(); SDL_Quit(); return 0; } /////////////////// Fim do método Main ////////////////////
int Game_Menu_Loop(Game_Surface *surface, Mix_Chunk *sound[], TTF_Font *font_big, TTF_Font *font_normal, SDL_TimerID *timer_id) { SDL_Event event; SDL_Rect piece_none_pos, arrow_position; //Structure contenant les données des niveaux Game_Level level[NOMBRE_NIVEAU] = {{{0}}}; //Structure contenant les données du joueur Player_Score score[NOMBRE_NIVEAU] = {{0}}; //Numéro du niveau, bool pour l'affichage de la flèche, numéro du menu int num_level = 0, continuer = 1, affiche_arrow = MENU_HIDE_ARROW, menu_select = MENU_MAIN; //Chargement des données du joueur if (Player_Score_Load(score)) { return EXIT_FAILURE; } //Chargement des niveaux if (Game_Level_Load(level)) { return EXIT_FAILURE; } //Affichage du menu principale Game_Menu_Display(surface, score, font_normal, num_level, MENU_MAIN); //Débloquage du premier niveau score[num_level].levelok = 1; //Boucle d'évènement de la SDL while(continuer) { SDL_WaitEvent(&event); switch(event.type) { case SDL_QUIT: continuer = 0; break; case SDL_KEYDOWN: //Si on presse la touche ECHAP, et que l'on est pas sur le menu principale on affiche ce dernier if ((event.key.keysym.sym == SDLK_ESCAPE) && menu_select != MENU_MAIN) { menu_select = MENU_MAIN; Game_Menu_Display(surface, score, font_normal, num_level, MENU_MAIN); } break; case SDL_MOUSEMOTION: //Fonction permettant de positionner la flèche de sélection du menu selon l'emplacement de la souris affiche_arrow = Game_Menu_Selection(surface->background, &arrow_position, event.motion.x, event.motion.y, menu_select, &num_level, 0); //Gestion de l'affichage de la flèche de sélection du menu Game_Menu_Arrow(surface, &arrow_position, &affiche_arrow, menu_select); break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { //Fonction qui permet de sélectionner le menu correspondant au choix de l'utilisateur selon le positionnement de la souris menu_select = Game_Menu_Selection(surface->background, &arrow_position, event.motion.x, event.motion.y, menu_select, &num_level, 1); //Operation à effectuer selon les choix de l'utilisateur switch (menu_select) { case MENU_NEXT: //On passe au niveau suivant, sauf si l'utilisateur à terminé le jeu if (num_level < NOMBRE_NIVEAU - 1) { ++num_level; } else { menu_select = MENU_FINISH; num_level = 0; break; } case MENU_GAME: //On lance une partie si le niveau choisis est débloqué if (score[num_level].levelok) { //Chargement du niveau Game_Level_Play(surface, font_big, level, num_level, &piece_none_pos); //Boucle de la partie, retourne le menu à afficher selon si le joueur à gagné ou perdu menu_select = Game_Loop(surface, sound, font_big, font_normal, level, score, num_level, &piece_none_pos, timer_id); } else { //Si l'utilisateur à choisi un niveau bloqué on réaffiche le menu level menu_select = MENU_LEVEL; } if (menu_select == MENU_WIN) { //Si le joueur à gagné on débloque le niveau suivant sauf si c'est à la fin du jeu if (num_level < NOMBRE_NIVEAU - 1) { score[num_level + 1].levelok = 1; } //On joue le son de fin du niveau if (Mix_PlayChannel(0, sound[4], 0)) { printf ("%s\n", Mix_GetError()); } } break; case MENU_QUIT: continuer = 0; break; } //Selon le choix du joueur ou le résultat de la partie on affiche l'image correspondante Game_Menu_Display(surface, score, font_normal, num_level, menu_select); } break; } //On met à jour l'affichage SDL_Flip(surface->background); } //On sauvegarde les données du joueur if (Player_Score_Save(score)) { return EXIT_FAILURE; } return 0; }
/*========================================================================= // Name: Mainloop() // Desc: the one and only mainloop ;-) //=======================================================================*/ void Mainloop() { SDL_Event event; while (!bDone) { /* Mainloop */ switch (gamestate) { case STATE_MENU: MainMenu_Loop(); SDL_Delay(TimeLeft()); break; case STATE_PLAY: while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: bDone = 1; break; case SDL_KEYDOWN: /* Escape can be pressed everytime to get back to the menu */ if (event.key.keysym.sym == SDLK_ESCAPE) gamestate = STATE_MENU; if (!bPause && !bGameOver) /* Is the game active? */ switch (event.key.keysym.sym) { case SDLK_SPACE: MoveCluster(1); /* "drop" cluster... */ NewCluster(); /* ... and create new one */ break; case SDLK_DOWN: if (MoveCluster(0)) NewCluster(); break; case SDLK_LEFT: MoveClusterLeft(); break; case SDLK_RIGHT: MoveClusterRight(); break; case SDLK_UP: TurnClusterRight(); break; case SDLK_p: bPause = 1; break; /* Activate pause mode */ case SDLK_c: /* Crazy mode... */ if (!bCrazy) bCrazy = 1; else { BoxDrawInit(); bCrazy = 0; } break; #ifdef DEBUG_CHANGE_LEVEL_WITH_KEYS case SDLK_w: if (level < 10) { level++; PutSound(&sndNextlevel); } break; case SDLK_q: if (level > 0) level--; break; #endif default: break; } else if (event.key.keysym.sym == SDLK_p) /* deactivate pause mode again */ bPause = 0; break; } } Game_Loop(); SDL_Delay(TimeLeft()); break; case STATE_GAMEOVER: break; case STATE_CREDITS: /* Credits_Loop(false); */ SDL_Delay(TimeLeft()); break; case STATE_EXIT: bDone = 1; break; } } }