/** * Attempt to move the player as instructed * * @param dungeon A pointer to the dungeon * @param move The move to make * * @return RESULT_WIN if the player has won the game * RESULT_DIE if the player has died in the game * INVALID_MOVE if the move is invalid * else 0 */ int makeMove(Dungeon* dungeon, char move) { Object *player; int result=0; int len; if(!dungeon->moveList) { dungeon->moveList = malloc(EXTEND_MOVE*4+1); bzero(dungeon->moveList, EXTEND_MOVE*4+1); } len = cgc_strlen(dungeon->moveList); sprintf(&dungeon->moveList[len], "!H", (unsigned char) move); if(!(player = getObjectById(dungeon->start, PLAYER_NUM))) _terminate(OBJECT_NOT_FOUND_ERROR); if(move == dungeon->moveTypes.left) { player->direction->x = 0; if((result = moveLeft(dungeon, player))) return result; if((result = moveEnemies(dungeon, player->moves))) return result; sendCurrentDungeonView(dungeon->start); if((result = checkFloor(dungeon, player))) return result; } else if(move == dungeon->moveTypes.right) { player->direction->x = 0; if((result = moveRight(dungeon, player))) return result; if((result = moveEnemies(dungeon, player->moves))) return result; sendCurrentDungeonView(dungeon->start); if((result = checkFloor(dungeon, player))) return result; } else if(move == dungeon->moveTypes.jump) return jump(dungeon, player); else if (move == dungeon->moveTypes.jumpleft) return jumpLeft(dungeon, player); else if (move == dungeon->moveTypes.jumpright) return jumpRight(dungeon, player); else if (move == dungeon->moveTypes.wait) { addMove(dungeon, player, dungeon->moveTypes.wait); if((result = moveEnemies(dungeon, player->moves))) return result; sendCurrentDungeonView(dungeon->start); return 0; } else return INVALID_MOVE; return 0; }
void Bakoom::timerEvent(QTimerEvent *event) { // create random scenery createRandomScenery(); // level 6 and 7 enemy spawns if(level >= 6) for(int i = 0; i < enemies_.size(); i++) if(rand()%1000 < 5 && enemies_.size() <= 12) enemies_.push_back(new Interceptor(enemies_.at(i)->getRect().x(), enemies_.at(i)->getRect().y())); // move scenery for(int i = 0; i < scenery_.size(); i++) scenery_.at(i)->autoMove(); // move enemies moveEnemies(); // make enemies shoot createEnemyProjectiles(); // automove credits for(int i = 0; i < credits_.size(); i++) credits_.at(i)->autoMove(); // automove medipaks_ for(int i = 0; i < medipaks_.size(); i++) medipaks_.at(i)->autoMove(); // automove projectiles_ for(int i = 0; i < projectiles_.size(); i++) { // homing projectiles_ if(projectiles_.at(i)->isHoming()) { int proj_x = projectiles_.at(i)->getRect().x(), proj_y = projectiles_.at(i)->getRect().y(); int enem_x = nearestEnemyTo(proj_x, proj_y)->getRect().x(), enem_y = nearestEnemyTo(proj_x, proj_y)->getRect().y(); if(distanceBetween(enem_x, enem_y, proj_x, proj_y) < 250) { if(projectiles_.at(i)->isEnemyProjectile()) enem_x = player_ ->getRect().x(); if(enem_x+40 > proj_x) projectiles_.at(i)->setXdir(1); else if(enem_x-40 < proj_x) projectiles_.at(i)->setXdir(-1); else projectiles_.at(i)->setXdir(0); } } projectiles_.at(i)->autoMove(); } checkCollision(); checkOutOfBounds(); deleteDead(); // check for win condition if(enemies_.size() == 0 && credits_.size() == 0) { shield = player_ ->getHealth(); // update shield variable before exiting qApp->exit(); } // auto heal if applicable if(hasItem[15]) autoHeal(); playerKeyEvents(); //deleteDead(); // move player player_->autoUpdateRect(); spawnMedipaks(); repaint(); }
void gameClass::update(float deltaTime) { if (newLevel) { currentLevel++; enemies.clear(); projectiles.clear(); player->tile.resetPos(mapLevel[currentLevel].getEntrancePos()); renderer->resetCam(player->tile.getPos(), player->tile.getSize()); newLevel = false; } renderer->getCam(renderingPort.x, renderingPort.y); renderingPort *= -1; spawnTimer += deltaTime; projectileTimer += deltaTime; moveEnemies(deltaTime); if (spawnTimer > Constants::spawnRate) { spawnEnemies(); spawnTimer = 0; } moveProjectiles(deltaTime); if(player->getHealth() <= 0) { if(!isPlayerDead) { animationTime = 0.0f; player->resetIndex(); isPlayerDead = true; player->setCurrentAction("tipping over"); SoundEngine->play2D("audio/Sound Effect (31).wav", GL_FALSE); } animationTime += deltaTime; if (animationTime >= Constants::animationFrameTime) { animationTime = 0.0f; player->increaseIndex(); } } }
/** * Attempt to jump JUMP_HEIGHT spaces up and return to starting position * NOTE: If there are not JUMP_HEIGHT spaces, player will stay at the highest * point until JUMP_HEIGHT moves upward have been made. The player will * then move down until the floor is reached. * * @param dungeon A pointer to the dungeon * @param dungeon A pointer to the object to move * * @return RESULT_WIN if the player has won the game * RESULT_DIE if the player has died in the game * else 0 */ int jump(Dungeon* dungeon, Object* object) { int result=0; object->direction->x = 0; object->direction->y = DIR_UP; for(int up=1; up<=JUMP_HEIGHT; up++) { if(object->id == PLAYER_NUM) addMove(dungeon, object, dungeon->moveTypes.jump); if((result = moveUp(dungeon, object))) return result; if((result = moveEnemies(dungeon, object->moves))) return result; sendCurrentDungeonView(dungeon->start); } object->direction->y = DIR_DOWN; if((result = checkFloor(dungeon, object))) return result; return 0; }
/** * Attempt to jump JUMP_HEIGHT spaces up and to the left * NOTE: If there are not JUMP_HEIGHT spaces, player will stay at the highest * point until JUMP_HEIGHT moves upward have been made. The player will * then move down until the floor is reached. Player will move left a * space for each move up and down unless a wall or floor is hit. * * @param dungeon A pointer to the dungeon * @param dungeon A pointer to the object to move * * @return RESULT_WIN if the player has won the game * RESULT_DIE if the player has died in the game * else 0 */ int jumpRight(Dungeon* dungeon, Object* object) { int result=0; object->direction->y = DIR_UP; object->direction->x = DIR_RIGHT; for(int up=1; up<=JUMP_HEIGHT; up++) { if((result = moveUp(dungeon, object))) return result; if((result = moveRight(dungeon, object))) return result; if((result = moveEnemies(dungeon, object->moves))) return result; sendCurrentDungeonView(dungeon->start); } object->direction->y = DIR_DOWN; if((result = checkFloor(dungeon, object))) return result; object->direction->x = 0; return 0; }
/** * Check if the object is standing on a floor object, if not move player * * @param dungeon A pointer to the dungeon and game info * @param object The object to check * * @return RESULT_WIN if the player has won the game * RESULT_DIE if the player has died in the game * else 0 */ int checkFloor(Dungeon *dungeon, Object* object) { Object* floor_obj; Coordinate floor_coord; int result=0; floor_coord.x = object->position->x; floor_coord.y = object->position->y+1; if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord))) _terminate(OBJECT_NOT_FOUND_ERROR); if(object->direction->x == 0) { while(floor_obj->id > WALL_NUM) { if((result = moveDown(dungeon, object))) return result; if(object->id == PLAYER_NUM) { addMove(dungeon, object, dungeon->moveTypes.left); if((result = moveEnemies(dungeon, object->moves))) return result; sendCurrentDungeonView(dungeon->start); } floor_coord.x = object->position->x; floor_coord.y = object->position->y+1; if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord))) _terminate(OBJECT_NOT_FOUND_ERROR); } } else if(object->direction->x == DIR_LEFT) { while(floor_obj->id > WALL_NUM) { if((result = moveDown(dungeon, object))) return result; if((result = moveLeft(dungeon, object))) return result; if(object->id == PLAYER_NUM) { if((result = moveEnemies(dungeon, object->moves))) return result; sendCurrentDungeonView(dungeon->start); } floor_coord.x = object->position->x; floor_coord.y = object->position->y+1; if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord))) _terminate(OBJECT_NOT_FOUND_ERROR); } } else if(object->direction->x == DIR_RIGHT) { while(floor_obj->id > WALL_NUM) { if((result = moveDown(dungeon, object))) return result; if((result = moveRight(dungeon, object))) return result; if(object->id == PLAYER_NUM) { if((result = moveEnemies(dungeon, object->moves))) return result; sendCurrentDungeonView(dungeon->start); } floor_coord.x = object->position->x; floor_coord.y = object->position->y+1; if(!(floor_obj = getObjectByCoord(dungeon->start, floor_coord))) _terminate(OBJECT_NOT_FOUND_ERROR); } } return 0; }
void mode1Loop(Input *pIn,GameOptions* pGameOptions,Screen* pScreen, GameState* pGameState){ MusicManager musicManager; audioInitialization(&musicManager); Mix_PlayMusic(musicManager.music[musicManager.currentMusic], -1); //Jouer infiniment la musique TTFManager ttfManager; ttfInitialization(pScreen,&ttfManager); initPauseText(pScreen, &ttfManager); Character character; characterInitialization(&character,pScreen); Enemies enemies; enemiesInitialization(&enemies,pScreen); Unit seed; initSeed(&seed,pScreen); randomMove(&seed); Collision collision; TimeManager timeManager; timeManager.debutTicks = (long) SDL_GetTicks(); timeManager.playingTime=0; long frame = 0; long frameTime = 0; long delay = 0; int score = 0; Texte scoreTexte = {0}; scoreTexte.rec.x=865; scoreTexte.rec.y=580; scoreTexte.rec.w=0; scoreTexte.rec.h=30; pGameState->lost = 0; //On set la taille du BG du mode pGameOptions->BGRec.x = 0; pGameOptions->BGRec.y = 0; pGameOptions->BGRec.w = PLAYING_AREA_WIDTH; pGameOptions->BGRec.h = PLAYING_AREA_HEIGHT; updateTTFManager(pScreen,&ttfManager,&timeManager,&enemies); updateSeedScore(pScreen, &scoreTexte, score, &ttfManager); while(!pGameState->menu && !pIn->quit && !pGameState->lost){ frameTime = (long) SDL_GetTicks(); frame++; updateInput(pIn); checkCollision(&character,&enemies,&collision,pGameState); moveEnemies(&enemies); moveCharacter(pIn,&collision,&character); //On ajoute un ennemi régulièrement if (frame%240 == 0){ addOneEnemy(&enemies); } //On met à jours l'afficheur du temps de jeu mais pas trop souvent if(frame%20 == 0){ updateTTFManager(pScreen,&ttfManager,&timeManager,&enemies); } //Est ce que le joueur à trouver une seed ? if(checkUnitCollisionWIthCharacter(&seed, &character)){ score ++; randomMove(&seed); updateSeedScore(pScreen, &scoreTexte, score, &ttfManager); } //On affiche l'ensemble SDL_RenderClear(pScreen->renderer); updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions); SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec); SDL_RenderCopy(pScreen->renderer,scoreTexte.pTexture, NULL, &scoreTexte.rec); SDL_RenderPresent(pScreen->renderer); //Si on vérifie si le joueur veux mettre en pause(P) ou quitter (Q) if(pIn->keys[SDL_SCANCODE_P]){ pGameState->pause=1; pIn->keys[SDL_SCANCODE_P]=0; } if(pIn->keys[SDL_SCANCODE_Q]){ pGameState->menu=1; } //boucle de pause if(pGameState->pause){ //il faut arrêter replacer le compteur de temps après la pause long pauseDebut = (long) SDL_GetTicks(); //on print dans le renderer ce qu'on veut afficher pendant la pause updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions); SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL1, NULL, &ttfManager.pauseTextL1Rec); SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL2, NULL, &ttfManager.pauseTextL2Rec); SDL_RenderCopy(pScreen->renderer, ttfManager.pauseTextL3, NULL, &ttfManager.pauseTextL3Rec); SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec); pauseLoop(pGameState,pIn,pScreen); timeManager.debutTicks += (long) SDL_GetTicks() - pauseDebut; } //Code pour attendre une durée de frame fixe delay = pScreen->frameDuration - (long) SDL_GetTicks() + frameTime; if (delay > 0) { SDL_Delay(delay); } } //Si le joueur sort du jeu car il a perdu la partie courante if(pGameState->lost){ pGameState->waiting=1; //Petit son de défaite Mix_PauseMusic(); Mix_PlayChannel(1, musicManager.sound[0], 0); //On print l'affichage de fin de partie updateScreen(&character,&enemies,pScreen,&ttfManager,pGameOptions); SDL_RenderCopy(pScreen->renderer, ttfManager.playAgain, NULL, &ttfManager.playAgainRec); SDL_RenderCopy(pScreen->renderer, ttfManager.BAM, NULL, &ttfManager.BAMRec); SDL_RenderCopy(pScreen->renderer,seed.pTexture, NULL, &seed.rec); //On attend que l'utilisateur décide de rejouer ou non endGameLoop(pIn,pGameState,pScreen); } }
void mode0Loop(Input *pIn,GameState *pGameState,Character *pCharacter,Enemies *pEnemies,Screen *pScreen,Collision *pCollision,MusicManager *pMusicManager,TTFManager * pTTFManager,TimeManager *pTimeManager,GameOptions* pGameOptions){ long frame = 0; long frameTime = 0; long delay = 0; enemiesInitialization(pEnemies,pScreen); pGameState->lost = 0; pTimeManager->debutTicks = (long) SDL_GetTicks(); pTimeManager->playingTime=0; Mix_PlayMusic(pMusicManager->music[pMusicManager->currentMusic], -1); //Jouer infiniment la musique //On set la taille du BG du mode pGameOptions->BGRec.x = 0; pGameOptions->BGRec.y = 0; pGameOptions->BGRec.w = PLAYING_AREA_WIDTH; pGameOptions->BGRec.h = PLAYING_AREA_HEIGHT; while(!pGameState->menu && !pIn->quit && !pGameState->lost){ frameTime = (long) SDL_GetTicks(); frame++; //On ajoute un ennemi régulièrement if (frame%240 == 0){ addOneEnemy(pEnemies); } //On vérifie les collisions checkCollision(pCharacter,pEnemies,pCollision,pGameState); //On met à jour les entrées claviers updateInput(pIn); //On déplace les objets du jeu moveEnemies(pEnemies); moveCharacter(pIn,pCollision,pCharacter); //On met à jours l'afficheur du temps de jeu mais pas trop souvent if(frame%20 == 0){ updateTTFManager(pScreen,pTTFManager,pTimeManager,pEnemies); } //On réaffiche l'ensemble SDL_RenderClear(pScreen->renderer); updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions); SDL_RenderPresent(pScreen->renderer); //Si on a appuyé sur p on rentre dans la boucle de pause if(pIn->keys[SDL_SCANCODE_P]){ pGameState->pause=1; pIn->keys[SDL_SCANCODE_P]=0; } if(pIn->keys[SDL_SCANCODE_Q]){ pGameState->menu=1; } if(pGameState->pause){ //il faut arrêter replacer le compteur de temps après la pause long pauseDebut = (long) SDL_GetTicks(); //on print dans le renderer ce qu'on veut afficher pendant la pause updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions); SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL1, NULL, &pTTFManager->pauseTextL1Rec); SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL2, NULL, &pTTFManager->pauseTextL2Rec); SDL_RenderCopy(pScreen->renderer, pTTFManager->pauseTextL3, NULL, &pTTFManager->pauseTextL3Rec); pauseLoop(pGameState,pIn,pScreen); pTimeManager->debutTicks += (long) SDL_GetTicks() - pauseDebut; } //Code pour attendre une durée de frame fixe delay = pScreen->frameDuration - (long) SDL_GetTicks() + frameTime; if (delay > 0) { SDL_Delay(delay); } } //Le joueur a perdu la partie courante if(pGameState->lost){ pGameState->waiting=1; //Petit son de défaite et on stoppe la musique courante Mix_PauseMusic(); Mix_PlayChannel(1, pMusicManager->sound[0], 0); if(pMusicManager->currentMusic==0){ pMusicManager->currentMusic=1; } else pMusicManager->currentMusic=0; //On print l'affichage de fin de partie updateScreen(pCharacter,pEnemies,pScreen,pTTFManager,pGameOptions); SDL_RenderCopy(pScreen->renderer, pTTFManager->playAgain, NULL, &pTTFManager->playAgainRec); SDL_RenderCopy(pScreen->renderer, pTTFManager->BAM, NULL, &pTTFManager->BAMRec); //On attend que l'utilisateur décide de rejouer ou non endGameLoop(pIn,pGameState,pScreen); } }
//function that is repeatedly called to render the window void renderWin1(int currentTime, int deltaTime) { Matrix4 vpMatrix, viewMatrix, modelMatrix; handleInput(deltaTime); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); viewMatrix = camera1->getViewMatrix(); vpMatrix = projectionMatrix * viewMatrix; Matrix4 orthographicMatrix = Matrix4::IDENTITY; orthographicMatrix = createOrthographicProjectionMatrix(win1.width, win1.height, -1, 1); char buffer[256]; if (State == "Play"){ checkEnemyCollision(); skybox->render_self(projectionMatrix*viewMatrix, camera1->getPosition(), win1.zFar); levels[currLevel]->drawLevel(vpMatrix); time->setPosition(Vector3(0, -330, 0)); if (Time >= 59){ Time -= 59; TimeMin++; } if (Time >= 9.0f){ sprintf(buffer, "Total time : %d:%0.0f", TimeMin, Time); } else{ sprintf(buffer, "Total time : %d:0%0.0f", TimeMin, Time); } std::string timeM(buffer); time->render(orthographicMatrix, timeM); cylinder1.setPosition((camera1->getPosition())); cylinder1.render(vpMatrix); for (int i = 0; i < 30; i++){ if (enemies[i]->getAlive()) enemies[i]->render(vpMatrix); moveEnemies(i); } if (hasSavePoint){ saveFlag->setPosition(savePoint); saveFlag->render(vpMatrix); } buffer[256]; sprintf(buffer, "Stamina: %0.2f", Stamina); std::string message(buffer); Paused->setPosition(Vector3(-390, -330, 0)); if (Stamina < 20){ Paused->setColor(Color(1, 0, 0, 1)); } else if (Stamina < 60){ Paused->setColor(Color(1, 1, 0, 1)); } else{ Paused->setColor(Color(0, 1, 0, 1)); } Paused->render(orthographicMatrix, message); checkNextLevel(); } else if (State == "Menu") { notice->setColor(Color(1, 0, 1, 0)); notice->setPosition(Vector3(-260, -180, 0)); notice->render(orthographicMatrix, "ARROWS TO NAVIGATE SPACE TO SELECT"); Title->render(orthographicMatrix, "Maze Adventures!"); PlayBut->render(orthographicMatrix, "Play"); if (MenOption == 0) PlayBut->setColor(Color(1, 1, 0, 1)); else PlayBut->setColor(Color(1, 1, 1, 200)); ControlsBut->render(orthographicMatrix, "Controls"); if (MenOption == 1) ControlsBut->setColor(Color(1, 1, 0, 1)); else ControlsBut->setColor(Color(1, 1, 1, 200)); CreditsBut->render(orthographicMatrix, "Credits"); if (MenOption == 2) CreditsBut->setColor(Color(1, 1, 0, 1)); else CreditsBut->setColor(Color(1, 1, 1, 200)); Exitbut->render(orthographicMatrix, "Exit"); if (MenOption == 3) Exitbut->setColor(Color(1, 1, 0, 0.1f)); else Exitbut->setColor(Color(1, 1, 1, 200)); if (isPaused){ Paused->setPosition(Vector3(-50, -150, 0)); Paused->setColor(Color(1, 0, 0, 1)); Paused->render(orthographicMatrix, "PAUSED"); if (MenOption == 4) Restartbut->setColor(Color(1, 1, 0, 1)); else Restartbut->setColor(Color(1, 1, 1, 200)); Restartbut->render(orthographicMatrix, "Restart Level"); } } else if (State == "Controls"){ Back->setPosition(Vector3(-260, 200, 0)); Back->render(orthographicMatrix, "BACK"); Controls1->render(orthographicMatrix, "MOVE: W - Forward, S - Backward"); Controls2->render(orthographicMatrix, "STRAFE: A - Left, D - Right"); Controls3->render(orthographicMatrix, "LOOK/TURN: Mouse"); Controls4->render(orthographicMatrix, "JUMP: Spacebar"); Controls5->render(orthographicMatrix, "SPRINT: L-Shift"); Controls6->render(orthographicMatrix, "PLACE SAVE: F - RETURN TO SAVE: G"); } else if (State == "Credits"){ Back->setPosition(Vector3(-260, 200, 0)); Credits1->render(orthographicMatrix, "Maze Adventures Created By:"); Credits2->render(orthographicMatrix, "Joel Scarfone & Alex Carlucci"); Back->render(orthographicMatrix, "BACK"); } else if (State == "Loading"){ time->setPosition(Vector3(-50, -150, 0)); sprintf(buffer, "Total time", Time); std::string timeM(buffer); //time->render(orthographicMatrix, timeM); char buffer[256]; sprintf(buffer, "Level: %d", currLevel + 1); std::string message(buffer); Loading->render(orthographicMatrix, message); Back->setPosition(Vector3(-50, -150, 0)); Back->render(orthographicMatrix, "Start"); } else if (State == "Game_Finished"){ Paused->setPosition(Vector3(-220, 120, 0)); Paused->setColor(Color(0, 1, 0, 0)); Paused->render(orthographicMatrix, "CONGRAGULATION YOU WON!"); if (Time >= 59){ Time -= 59; TimeMin++; } if (Time >= 9.0f){ sprintf(buffer, "Total time: %d:%0.0f", TimeMin, Time); } else{ sprintf(buffer, "Total time: %d:0%0.0f", TimeMin, Time); } std::string timeM(buffer); time->render(orthographicMatrix, timeM); time->setPosition(Vector3(-150, -150, 0)); } glutSwapBuffers(); //works with GL_DOUBLE. use glFlush(); instead, if using GL_SINGLE }
void run(){ Display gDisplay; Assets gAssets; ControlState gControlState; SDL_Event e; bool quit = false; srand(time(NULL)); if (!initDisplay(&gDisplay)) { fprintf(stderr, "ERROR: failed to initialize\n"); exit(1); } if (!loadAssets(&gAssets, &gDisplay)) { fprintf(stderr, "ERROR: failed to load game assets\n"); exit(1); } Player p = P_createPlayer(); AI *ai = AI_createAI(); LinkedList playerBulletList = LL_createLinkedList(); LinkedList enemyBulletList = LL_createLinkedList(); LinkedList enemyList = LL_createLinkedList(); Timer fpsCapTimer = T_createTimer(); Timer gameTimer = T_createTimer(); unsigned int lastShooting = 0; unsigned int lastEnemenySpawn = 0; unsigned int check = 0; T_start(&gameTimer); int controlarray[4] = {0}; SDL_Rect healthbar; initialisehealthbar(&healthbar); quit = staticscreen(gDisplay.renderer, "Assets/startmenu.bmp"); SDL_Surface* temp; SDL_Texture* background; temp = SDL_LoadBMP("Assets/background.bmp"); background = SDL_CreateTextureFromSurface(gDisplay.renderer, temp); SDL_FreeSurface(temp); temp = NULL; /*Event loop*/ do{ // start frame timer T_start(&fpsCapTimer); // check for exit event SDL_PollEvent(&e); quit = (e.type == SDL_QUIT); // check to open ai interface if(e.type == SDL_KEYDOWN){ if(e.key.keysym.sym == SDLK_ESCAPE){ quit = openaiscreen(gDisplay.renderer, controlarray); e.key.keysym.sym = SDLK_0; SDL_PushEvent(&e); } } // move player getKeyState(&gControlState); getMouseState(&gControlState); movePlayer(&p, &gControlState, &gAssets); AI_move(ai, P_getPosition(&p)); if ((check = T_getTicks(&gameTimer)) - lastEnemenySpawn > DEFAULT_SPAWN_INTERVAL) { spawnEnemy(&enemyList); lastEnemenySpawn = check; } aiaction(ai, &playerBulletList, &enemyList, T_getTicks(&gameTimer), controlarray, &p); moveEnemies(&enemyList, P_getPosition(&p)); enemiesShoot(&enemyList, &enemyBulletList, &p, T_getTicks(&gameTimer)); if (leftMouseIsDown() && ((check = T_getTicks(&gameTimer)) - lastShooting) > SHOOT_DELAY) { double mx = (double)gControlState.mouseX / SCREEN_WIDTH; double my = (double)gControlState.mouseY / SCREEN_HEIGHT; Point origin = P_getPosition(&p); Point destination = {mx, my}; shootBullet(&playerBulletList, origin, getShotDirection(origin, destination), PLAYER); lastShooting = check; } moveBullets(&playerBulletList); moveBullets(&enemyBulletList); detectCollision(&playerBulletList, &enemyList, &gAssets); detectCollisionPlayer(&enemyBulletList, &p, &gAssets); /* Update Screen */ SDL_RenderCopy(gDisplay.renderer, background, NULL, NULL); displayhealth(gDisplay.renderer, healthbar, p.health); renderBullets(&playerBulletList, &gDisplay, &gAssets, PLAYER); renderBullets(&enemyBulletList, &gDisplay, &gAssets, ENEMY); renderEnemies(&enemyList, &gDisplay, &gAssets); renderPlayer(&gDisplay, &gAssets, &gControlState); renderAI(ai, &gDisplay, &gAssets); // draw screen SDL_RenderPresent(gDisplay.renderer); delayNextFrame(T_getTicks(&fpsCapTimer)); if (gameOver(&p)) { printf("GAME OVER\n"); quit = staticscreen(gDisplay.renderer, "Assets/gameover.bmp"); p.health = 100; } } while (!quit); /* Memory Cleanup */ LL_destroyLinkedList(&playerBulletList); LL_destroyLinkedList(&enemyBulletList); AI_destroyAI(ai); SDL_DestroyTexture(background); freeAssets(&gAssets); closeDisplay(&gDisplay); }