void GameOutputFrame(void) { const float screenYOff = (float)MAX(-SCREEN_HEIGHT, SCREEN_Y(camera.Y) - SCREEN_HEIGHT / 2); // Draw the background. DrawBackground(&BG, screenYOff); SpaceDraw(&space, screenYOff); PickupsDraw(Screen, screenYOff); ParticlesDraw(Screen, screenYOff); int c = 0; for (int i = 0; i < MAX_PLAYERS; i++) { PlayerDraw(&players[i], screenYOff); if (!players[i].Enabled) continue; // Draw each player's current score. char buf[17]; sprintf(buf, "%d", players[i].Score); const SDL_Color white = { 255, 255, 255, 255 }; #ifdef TTF SDL_Surface *t = TTF_RenderText_Blended(font, buf, white); #endif const int x = (c + 1) * SCREEN_WIDTH / (PlayerEnabledCount() + 1); #ifdef TTF const int wHalf = (t->w + PLAYER_SPRITESHEET_WIDTH) / 2; #else const int wHalf = (16 + PLAYER_SPRITESHEET_WIDTH) / 2; #endif // Draw the player icon, followed by the score number SDL_Rect src = { 0, 0, PLAYER_SPRITESHEET_WIDTH, PLAYER_SPRITESHEET_HEIGHT }; SDL_Rect dest = { (Sint16)(x - wHalf), 0, 0, 0 }; SDL_BlitSurface(PlayerSpritesheets[i], &src, Screen, &dest); // Draw score number dest.x = (Sint16)(x - wHalf + PLAYER_SPRITESHEET_WIDTH); #ifdef TTF dest.y = (Sint16)(PLAYER_SPRITESHEET_HEIGHT - t->h) / 2; #else dest.y = (Sint16)(PLAYER_SPRITESHEET_HEIGHT - 16) / 2; #endif #ifdef TTF SDL_BlitSurface(t, NULL, Screen, &dest); SDL_FreeSurface(t); #endif c++; } SDL_Flip(Screen); }
void ToTitleScreen(const bool start) { countdownMs = -1; ResetMovement(); MusicSetLoud(false); BackgroundsInit(&BG); Start = start; if (Start) { sprintf( WelcomeMessage, "%s to pause\n%s to exit", GetPausePrompt(), GetExitGamePrompt()); } else { // Find out the result of the game int maxScore = 0; for (int i = 0; i < MAX_PLAYERS; i++) { if (players[i].Score > maxScore) maxScore = players[i].Score; } winners = 0; for (int i = 0; i < MAX_PLAYERS; i++) { if (!players[i].Enabled) continue; if (players[i].Score == maxScore) { winnerIndices[winners] = i; winners++; } } if (PlayerEnabledCount() == 1) { sprintf( WelcomeMessage, "Your score was %d!\n%s to exit", maxScore, GetExitGamePrompt()); } else if (winners == 1) { sprintf( WelcomeMessage, "Wins with score %d!\n%s to exit", maxScore, GetExitGamePrompt()); } else { sprintf( WelcomeMessage, "Tied with score %d!\n%s to exit", maxScore, GetExitGamePrompt()); } HighScoresAdd(maxScore); } HighScoreDisplayInit(&HSD); CArrayClear(&Particles); SpaceReset(&space); // Add bottom edge so we don't fall through SpaceAddBottomEdge(&space); // Initialise players here for (int i = 0; i < MAX_PLAYERS; i++) { PlayerInit(&players[i], i, cpv( (i + 1) * FIELD_WIDTH / (MAX_PLAYERS + 1), FIELD_HEIGHT * 0.75f)); playersEnabled[i] = false; } // Add platforms for players to jump off for (int i = 0; i < MAX_PLAYERS; i++) { BlockInit( &blocks[i], (i + 1) * FIELD_WIDTH / (MAX_PLAYERS + 1) - BLOCK_WIDTH / 2, BLOCK_Y, BLOCK_WIDTH); } GatherInput = TitleScreenGatherInput; DoLogic = TitleScreenDoLogic; OutputFrame = TitleScreenOutputFrame; }