Added GameOver screen
This commit is contained in:
parent
9e1738c05d
commit
3b2a0c8741
151
gameover.c
Normal file
151
gameover.c
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include <SDL2/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "gameover.h"
|
||||||
|
#include "gamestate.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#define GAMEOVER_TexturePath "assets/images/gameover.png"
|
||||||
|
#define GAMEOVER_NumbersTexturePath "assets/images/numbers.png"
|
||||||
|
#define GAMEOVER_ScoreTexturePath "assets/images/yourscore.png"
|
||||||
|
#define GAMEOVER_HUDScale 16.0f
|
||||||
|
#define GAMEOVER_Scale 4.0f
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include <SDL2/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "breakout.h"
|
||||||
|
#include "vector.h"
|
||||||
|
#include "background.h"
|
||||||
|
|
||||||
|
int GAMEOVER_HUDMargin = 5;
|
||||||
|
SDL_Texture * GAMEOVER_Texture;
|
||||||
|
SDL_Texture * GAMEOVER_Numbers;
|
||||||
|
SDL_Texture * GAMEOVER_ScoreTexture;
|
||||||
|
SDL_Rect * GAMEOVER_NumberRects;
|
||||||
|
SDL_Rect GAMEOVER_TargetRect;
|
||||||
|
SDL_Rect GAMEOVER_ScoreTargetRect;
|
||||||
|
SDL_Rect GAMEOVER_HUDScoreTargetRect;
|
||||||
|
int * GAMEOVER_Digits;
|
||||||
|
bool GAMEOVER_IsInit = false;
|
||||||
|
|
||||||
|
void GAMEOVER_Initialize(SDL_Renderer * renderer){
|
||||||
|
if (!GAMEOVER_IsInit) {
|
||||||
|
printf("Initializing Gameover...\n");
|
||||||
|
GAMEOVER_Texture = IMG_LoadTexture(renderer, GAMEOVER_TexturePath);
|
||||||
|
if (!GAMEOVER_Texture) printf("Gameover Texture couldn't be loaded!\n");
|
||||||
|
GAMEOVER_Numbers = IMG_LoadTexture(renderer, GAMEOVER_NumbersTexturePath);
|
||||||
|
if (!GAMEOVER_Numbers) printf("Gameover Numbers couldn't be loaded!\n");
|
||||||
|
GAMEOVER_ScoreTexture = IMG_LoadTexture(renderer, GAMEOVER_ScoreTexturePath);
|
||||||
|
if (!GAMEOVER_ScoreTexture) printf("Gameover Score Texture couldn't be loaded!\n");
|
||||||
|
int w, h;
|
||||||
|
SDL_QueryTexture(GAMEOVER_Texture, NULL, NULL, &w, &h);
|
||||||
|
w /= 2;
|
||||||
|
h /= 2;
|
||||||
|
GAMEOVER_TargetRect.x = ((1920 - w) / 2);
|
||||||
|
GAMEOVER_TargetRect.y = 50;
|
||||||
|
GAMEOVER_TargetRect.w = w;
|
||||||
|
GAMEOVER_TargetRect.h = h;
|
||||||
|
GAMEOVER_NumberRects = calloc(10, sizeof(SDL_Rect));
|
||||||
|
if (!GAMEOVER_NumberRects) printf("FATAL: Memory Allocation Failed!\n");
|
||||||
|
GAMEOVER_NumberRects[0] = (SDL_Rect) {.x = 446, .y = 668, .w = 442, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[1] = (SDL_Rect) {.x = 1299, .y = 1335, .w = 242, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[2] = (SDL_Rect) {.x = 1, .y = 1, .w = 443, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[3] = (SDL_Rect) {.x = 1, .y = 668, .w = 443, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[4] = (SDL_Rect) {.x = 1, .y = 1335, .w = 443, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[5] = (SDL_Rect) {.x = 446, .y = 1, .w = 443, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[6] = (SDL_Rect) {.x = 891, .y = 1, .w = 443, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[7] = (SDL_Rect) {.x = 890, .y = 1335, .w = 407, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[8] = (SDL_Rect) {.x = 446, .y = 1335, .w = 442, .h = 665 };
|
||||||
|
GAMEOVER_NumberRects[9] = (SDL_Rect) {.x = 890, .y = 668, .w = 442, .h = 665 };
|
||||||
|
GAMEOVER_ScoreTargetRect.y = 450;
|
||||||
|
GAMEOVER_ScoreTargetRect.h = 183;
|
||||||
|
GAMEOVER_ScoreTargetRect.w = 1000;
|
||||||
|
GAMEOVER_HUDScoreTargetRect = (SDL_Rect) {.x = GAMEOVER_HUDMargin, .y = GAMEOVER_HUDMargin, .w = 250, .h = 46 };
|
||||||
|
GAMEOVER_Digits = malloc(25 * sizeof(int));
|
||||||
|
printf("Gameover initialized!\n");
|
||||||
|
GAMEOVER_IsInit = true;
|
||||||
|
} else
|
||||||
|
printf("Gameover already initialized!\n");
|
||||||
|
} /* GAMEOVER_Initialize */
|
||||||
|
|
||||||
|
void GAMEOVER_Draw(SDL_Renderer * renderer, Scenery * scenery){
|
||||||
|
int i, count;
|
||||||
|
|
||||||
|
SDL_RenderCopy(renderer, GAMEOVER_Texture, NULL, &GAMEOVER_TargetRect);
|
||||||
|
GAMEOVER_GetDigits((scenery->Score), &count);
|
||||||
|
int totalWidth = GAMEOVER_ScoreTargetRect.w;
|
||||||
|
for (i = (count - 1); i >= 0; i--) {
|
||||||
|
totalWidth += (int)roundf((float)GAMEOVER_NumberRects[i].w / GAMEOVER_Scale);
|
||||||
|
}
|
||||||
|
GAMEOVER_ScoreTargetRect.x = ((1920 - totalWidth) / 2);
|
||||||
|
SDL_RenderCopy(renderer, GAMEOVER_ScoreTexture, NULL, &GAMEOVER_ScoreTargetRect);
|
||||||
|
int xOffset = GAMEOVER_ScoreTargetRect.x + GAMEOVER_ScoreTargetRect.w;
|
||||||
|
SDL_Rect target;
|
||||||
|
target.y = 450;
|
||||||
|
for (i = (count - 1); i >= 0; i--) {
|
||||||
|
target.x = xOffset;
|
||||||
|
target.h = (int)roundf((float)(GAMEOVER_NumberRects[GAMEOVER_Digits[i]].h) / GAMEOVER_Scale);
|
||||||
|
target.w = (int)roundf((float)(GAMEOVER_NumberRects[GAMEOVER_Digits[i]].w) / GAMEOVER_Scale);
|
||||||
|
SDL_RenderCopy(renderer, GAMEOVER_Numbers, (GAMEOVER_NumberRects + GAMEOVER_Digits[i]), &target);
|
||||||
|
xOffset += target.w;
|
||||||
|
}
|
||||||
|
} /* GAMEOVER_Draw */
|
||||||
|
|
||||||
|
void GAMEOVER_GetDigits(int input, int * digitCount){
|
||||||
|
int score = input;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (score != 0) {
|
||||||
|
GAMEOVER_Digits[(count++)] = (score % 10);
|
||||||
|
score /= 10;
|
||||||
|
}
|
||||||
|
*digitCount = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SCORE_DrawHUD(SDL_Renderer * renderer, Scenery * scenery){
|
||||||
|
int i, count;
|
||||||
|
|
||||||
|
GAMEOVER_GetDigits((scenery->Score), &count);
|
||||||
|
int totalWidth = GAMEOVER_HUDScoreTargetRect.w;
|
||||||
|
for (i = (count - 1); i >= 0; i--) {
|
||||||
|
totalWidth += (int)roundf((float)GAMEOVER_NumberRects[i].w / GAMEOVER_HUDScale);
|
||||||
|
}
|
||||||
|
GAMEOVER_HUDScoreTargetRect.x = GAMEOVER_HUDMargin;
|
||||||
|
SDL_RenderCopy(renderer, GAMEOVER_ScoreTexture, NULL, &GAMEOVER_HUDScoreTargetRect);
|
||||||
|
int xOffset = GAMEOVER_HUDScoreTargetRect.x + GAMEOVER_HUDScoreTargetRect.w;
|
||||||
|
SDL_Rect target;
|
||||||
|
target.y = GAMEOVER_HUDMargin;
|
||||||
|
for (i = (count - 1); i >= 0; i--) {
|
||||||
|
target.x = xOffset;
|
||||||
|
target.h = (int)roundf((float)(GAMEOVER_NumberRects[GAMEOVER_Digits[i]].h) / GAMEOVER_HUDScale);
|
||||||
|
target.w = (int)roundf((float)(GAMEOVER_NumberRects[GAMEOVER_Digits[i]].w) / GAMEOVER_HUDScale);
|
||||||
|
SDL_RenderCopy(renderer, GAMEOVER_Numbers, (GAMEOVER_NumberRects + GAMEOVER_Digits[i]), &target);
|
||||||
|
xOffset += target.w;
|
||||||
|
}
|
||||||
|
} /* SCORE_DrawHUD */
|
||||||
|
|
||||||
|
void GAMEOVER_Deinitialize(){
|
||||||
|
if (GAMEOVER_IsInit) {
|
||||||
|
printf("De-initializing Gameover...\n");
|
||||||
|
free(GAMEOVER_Digits);
|
||||||
|
SDL_DestroyTexture(GAMEOVER_Texture);
|
||||||
|
SDL_DestroyTexture(GAMEOVER_ScoreTexture);
|
||||||
|
SDL_DestroyTexture(GAMEOVER_Numbers);
|
||||||
|
printf("Gameover de-initialized!\n");
|
||||||
|
GAMEOVER_IsInit = false;
|
||||||
|
} else
|
||||||
|
printf("Gameover already de-initialized!\n");
|
||||||
|
}
|
25
gameover.h
Normal file
25
gameover.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef __gameover_h__
|
||||||
|
#define __gameover_h__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include <SDL2/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "gameover.h"
|
||||||
|
#include "gamestate.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
// Prototypes
|
||||||
|
void GAMEOVER_Initialize(SDL_Renderer * renderer);
|
||||||
|
void GAMEOVER_Draw(SDL_Renderer * renderer, Scenery * scenery);
|
||||||
|
void GAMEOVER_GetDigits(int input, int * digitCount);
|
||||||
|
void SCORE_DrawHUD(SDL_Renderer * renderer, Scenery * scenery);
|
||||||
|
void GAMEOVER_Deinitialize();
|
||||||
|
// End Prototypes
|
||||||
|
|
||||||
|
#endif // __gameover_h__
|
@ -1,6 +1,6 @@
|
|||||||
#ifndef __gamestate_h__
|
#ifndef __gamestate_h__
|
||||||
#define __gamestate_h__
|
#define __gamestate_h__
|
||||||
|
|
||||||
typedef enum gameStateEnum { MainMenu = 1, Game = 2, LevelSelect = 3, SkinSelect = 4, Settings = 5, Highscores = 6 } GameState;
|
typedef enum gameStateEnum { MainMenu = 1, Game = 2, LevelSelect = 3, SkinSelect = 4, Settings = 5, Highscores = 6 , GameOver = 7 } GameState;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
11
main.c
11
main.c
@ -12,6 +12,7 @@
|
|||||||
#include "startmenu.h"
|
#include "startmenu.h"
|
||||||
#include "gamestate.h"
|
#include "gamestate.h"
|
||||||
#include "highscores.h"
|
#include "highscores.h"
|
||||||
|
#include "gameover.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "background.h"
|
#include "background.h"
|
||||||
|
|
||||||
@ -55,12 +56,14 @@ int main(int argc, char * args[]){
|
|||||||
HIGHSCORES_Draw(renderer);
|
HIGHSCORES_Draw(renderer);
|
||||||
break;
|
break;
|
||||||
case Settings:
|
case Settings:
|
||||||
Settings_Draw(renderer,&scenery);
|
Settings_Draw(renderer, &scenery);
|
||||||
|
case GameOver:
|
||||||
|
GAMEOVER_Draw(renderer, &scenery);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unknow state was updated: %d\n", gameState);
|
printf("Unknow state was updated: %d\n", gameState);
|
||||||
break;
|
break;
|
||||||
}
|
} /* switch */
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
fps_frames++;
|
fps_frames++;
|
||||||
if (fps_lasttime < SDL_GetTicks() - 1000) {
|
if (fps_lasttime < SDL_GetTicks() - 1000) {
|
||||||
@ -179,17 +182,19 @@ void INITIALIZE() {
|
|||||||
printf("Window was created!\n");
|
printf("Window was created!\n");
|
||||||
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
||||||
printf("Renderer was created!\n");
|
printf("Renderer was created!\n");
|
||||||
BREAKOUT_INITIALIZE(renderer, width, height);
|
BREAKOUT_INITIALIZE(renderer);
|
||||||
scenery = BREAKOUT_CreateDefault();
|
scenery = BREAKOUT_CreateDefault();
|
||||||
Load_Textures(renderer);
|
Load_Textures(renderer);
|
||||||
HIGHSCORES_Initialize();
|
HIGHSCORES_Initialize();
|
||||||
BACKGROUND_Initialize(renderer, width, height);
|
BACKGROUND_Initialize(renderer, width, height);
|
||||||
Settings_Initialize(renderer);
|
Settings_Initialize(renderer);
|
||||||
|
GAMEOVER_Initialize(renderer);
|
||||||
printf("Initializing finished!\n");
|
printf("Initializing finished!\n");
|
||||||
} /* INITIALIZE */
|
} /* INITIALIZE */
|
||||||
|
|
||||||
void QUIT(){
|
void QUIT(){
|
||||||
printf("De-initializing started...\n");
|
printf("De-initializing started...\n");
|
||||||
|
GAMEOVER_Deinitialize();
|
||||||
BACKGROUND_Deinitialize();
|
BACKGROUND_Deinitialize();
|
||||||
Settings_Deinitialize();
|
Settings_Deinitialize();
|
||||||
HIGHSCORES_Deinitialize();
|
HIGHSCORES_Deinitialize();
|
||||||
|
3
main.h
3
main.h
@ -15,6 +15,9 @@
|
|||||||
#include "startmenu.h"
|
#include "startmenu.h"
|
||||||
#include "gamestate.h"
|
#include "gamestate.h"
|
||||||
#include "highscores.h"
|
#include "highscores.h"
|
||||||
|
#include "gameover.h"
|
||||||
|
#include "settings.h"
|
||||||
|
#include "background.h"
|
||||||
|
|
||||||
#ifndef __nullptr__
|
#ifndef __nullptr__
|
||||||
#define Nullptr(type) (type *)0
|
#define Nullptr(type) (type *)0
|
||||||
|
Loading…
Reference in New Issue
Block a user