breakout/main.c

239 lines
8.0 KiB
C
Raw Normal View History

2018-01-07 14:19:35 +01:00
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
2018-01-07 14:19:35 +01:00
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include "breakout.h"
#include "vector.h"
2018-01-15 13:19:51 +01:00
#include "startmenu.h"
#include "gamestate.h"
2018-01-07 14:19:35 +01:00
#ifndef __nullptr__
#define Nullptr(type) (type *)0
#endif // __nullptr__
#define ae "\204"
#define oe "\224"
#define ue "\201"
#define ss "\341"
2018-01-15 13:54:17 +01:00
2018-01-07 14:19:35 +01:00
void INITIALIZE();
void QUIT();
2018-01-15 13:54:17 +01:00
void DrawText(SDL_Renderer * renderer, const char * text);
void DrawBackground(SDL_Renderer * renderer);
2018-01-14 13:47:05 +01:00
void printFontStyle(TTF_Font * ffont);
2018-01-07 14:19:35 +01:00
void mousePress(SDL_MouseButtonEvent b);
2018-01-07 14:45:07 +01:00
void keyPress(SDL_KeyboardEvent b);
2018-01-08 00:45:32 +01:00
void windowChanged(SDL_WindowEvent b);
void toggleFullscreen();
int readIntFromIO(char * m1, char * m2, char * m3, int min, int max);
2018-01-07 14:19:35 +01:00
2018-01-15 13:54:17 +01:00
const int width = 1920;
const int height = 1080;
float XScale = 1.0f, YScale = 1.0f;
2018-01-07 14:19:35 +01:00
Uint8 * keystate; // TODO: export all this into scenery and enemy waves
SDL_Window * window;
SDL_Renderer * renderer;
SDL_Event event;
2018-01-08 00:45:32 +01:00
bool running = true, fullscreen = false;
2018-01-14 13:47:05 +01:00
TTF_Font * font = NULL;
GameState gameState = Game;
2018-01-07 14:19:35 +01:00
Ball ball;
2018-01-07 14:19:35 +01:00
int main(int argc, char * args[]){
printf("Spielbereiche\n\t- 1: Hauptmen"ue "\n\t- 2: Spiel\n\t- 3: Level Select\n\t- 4: Settings\n\t- 5: Highscores\n");
gameState = readIntFromIO("W"ae "hle einen Spielbereich aus, den du testen m"oe "chtest:", "Fehlerhafte Eingabe!\n", "%d ist kein g"ue "ltiger Spielbereich!\n", 1, 5);
2018-01-07 14:19:35 +01:00
INITIALIZE();
while (running) { // Gameloop
2018-01-07 14:19:35 +01:00
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) running = false;
2018-01-07 14:45:07 +01:00
else keyPress(event.key);
2018-01-07 14:19:35 +01:00
break;
case SDL_MOUSEBUTTONDOWN:
mousePress(event.button);
break;
2018-01-08 00:45:32 +01:00
case SDL_WINDOWEVENT:
windowChanged(event.window);
break;
2018-01-07 14:19:35 +01:00
}
}
2018-01-15 13:54:17 +01:00
keystate = SDL_GetKeyboardState(NULL);
DrawBackground(renderer);
switch (gameState) {
case Game:
BREAKOUT_Update(keystate);
BREAKOUT_Draw(renderer);
break;
case MainMenu:
// Startmenu_Update(keystate);
2018-01-15 13:54:17 +01:00
Startmenu_Draw(renderer);
break;
default:
printf("Unknow state was updated: %d\n", gameState);
}
// DrawText(renderer, "FICK DICH");
2018-01-15 13:54:17 +01:00
SDL_RenderPresent(renderer);
2018-01-07 14:19:35 +01:00
}
QUIT();
return 0;
} /* main */
void mousePress(SDL_MouseButtonEvent b){ // Debug prop
if (b.button == SDL_BUTTON_LEFT) {
printf("Left mouse pressed at %d, %d\n", b.x, b.y);
2018-01-07 14:19:35 +01:00
} else if (b.button == SDL_BUTTON_RIGHT) {
printf("Right mouse pressed...\n");
} else {
printf("Unknown mouse button pressed: %d\n", b.button);
}
}
2018-01-07 14:45:07 +01:00
void keyPress(SDL_KeyboardEvent b){ // Debug prop
printf("Key pressed: ID is %d\n", b.keysym.scancode);
if (b.keysym.scancode == SDL_SCANCODE_F11 || b.keysym.scancode == SDL_SCANCODE_5) {
2018-01-08 00:45:32 +01:00
toggleFullscreen();
}
}
void toggleFullscreen(){
if (fullscreen) {
SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
} else {
SDL_SetWindowFullscreen(window, 0);
}
fullscreen = !fullscreen;
}
void windowChanged(SDL_WindowEvent b){ // Debug prop
switch (b.event) {
case SDL_WINDOWEVENT_SIZE_CHANGED:
printf("Window was resized to (%d|%d)!\n", event.window.data1, event.window.data2);
2018-01-15 13:54:17 +01:00
// BREAKOUT_ChangeSize(event.window.data1, event.window.data2);
XScale = ((double)(event.window.data1) / (double)width);
YScale = ((double)(event.window.data2) / (double)height);
SDL_RenderSetScale(renderer, XScale, YScale);
2018-01-08 00:45:32 +01:00
break;
}
2018-01-07 14:19:35 +01:00
}
2018-01-15 13:54:17 +01:00
void DrawBackground(SDL_Renderer * renderer){
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
2018-01-15 13:54:17 +01:00
} /* DrawFrame */
2018-01-14 13:47:05 +01:00
2018-01-15 13:54:17 +01:00
void DrawText(SDL_Renderer * renderer, const char * text){
2018-01-14 13:47:05 +01:00
int w, h;
2018-01-15 13:54:17 +01:00
if (TTF_SizeText(font, text, &w, &h)) {
2018-01-14 13:47:05 +01:00
// perhaps print the current TTF_GetError(), the string can't be rendered...
} else {
printf("width=%d height=%d\n", w, h);
}
2018-01-15 13:54:17 +01:00
SDL_Color White = { 255, 255, 255 }; // this is the color in rgb format, maxing out all would give you the color white, and it will be your text's color
SDL_Surface * surfaceMessage = TTF_RenderText_Solid(font, text, White); // as TTF_RenderText_Solid could only be used on SDL_Surface then you have to create the surface first
2018-01-14 13:47:05 +01:00
SDL_Texture * Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); // now you can convert it into a texture
SDL_Rect Message_rect = (SDL_Rect) {.x = 0, .y = 0, .w = w, .h = h }; // create a rect
SDL_RenderCopy(renderer, Message, NULL, &Message_rect); // you put the renderer's name first, the Message, the crop size(you can ignore this if you don't want to dabble with cropping), and the rect which is the size and coordinate of your texture
SDL_FreeSurface(surfaceMessage);
SDL_DestroyTexture(Message);
2018-01-15 13:54:17 +01:00
}
2018-01-14 13:47:05 +01:00
void printFontStyle(TTF_Font * ffont){
int style;
style = TTF_GetFontStyle(ffont);
printf("The font style is:");
if (style == TTF_STYLE_NORMAL)
printf(" normal");
else {
if (style & TTF_STYLE_BOLD)
printf(" bold");
if (style & TTF_STYLE_ITALIC)
printf(" italic");
if (style & TTF_STYLE_UNDERLINE)
printf(" underline");
if (style & TTF_STYLE_STRIKETHROUGH)
printf(" strikethrough");
}
printf("\n");
2018-01-07 14:19:35 +01:00
}
void INITIALIZE() {
srand(time(NULL));
2018-01-14 13:47:05 +01:00
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) printf("SDL could not initialize! Error: %s\n", SDL_GetError());
2018-01-07 14:19:35 +01:00
else printf("SDL was successfully initialized!\n");
2018-01-14 13:47:05 +01:00
if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) printf("IMG could not initialize! Error: %s\n", IMG_GetError());
else printf("IMG was successfully initialized!\n");
2018-01-14 13:47:05 +01:00
if (TTF_Init() == -1) printf("TTF could not initialize! Error: %s\n", TTF_GetError());
else printf("TTF was successfully initialized!\n");
// load font.ttf at size 16 into font
font = TTF_OpenFont("assets/fonts/minecraft.ttf", 32);
if (!font) printf("Font could not initialize! Error: %s\n", TTF_GetError());
else printf("Font was successfully initialized!\n");
printFontStyle(font);
2018-01-07 14:19:35 +01:00
window = SDL_CreateWindow("BreakING", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
2018-01-08 00:45:32 +01:00
SDL_SetWindowResizable(window, true);
2018-01-07 14:19:35 +01:00
printf("Window was created!\n");
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
printf("Renderer was created!\n");
2018-01-10 23:56:47 +01:00
BREAKOUT_INITIALIZE(renderer, width, height);
2018-01-15 13:19:51 +01:00
Load_Textures(renderer);
2018-01-07 14:19:35 +01:00
} /* INITIALIZE */
void QUIT(){
printf("De-initializing started...\n");
2018-01-10 23:56:47 +01:00
BREAKOUT_DEINITIALIZE();
2018-01-07 14:19:35 +01:00
free(keystate);
2018-01-14 13:47:05 +01:00
TTF_CloseFont(font);
font = NULL; // to be safe...
TTF_Quit();
IMG_Quit();
2018-01-07 14:19:35 +01:00
printf("Quitting SDL_IMG finished!\n");
SDL_DestroyRenderer(renderer);
printf("De-initializing renderer finished!\n");
SDL_DestroyWindow(window);
printf("De-initializing window finished!\n");
SDL_Quit();
printf("Quitting SDL finished!\n");
printf("De-initializing finished!\n");
} /* QUIT */
int readIntFromIO(char * m1, char * m2, char * m3, int min, int max){
int nitems, num;
while (1) {
while (1) {
printf(m1);
nitems = scanf("%d", &num);
if (nitems == 0) {
printf(m2);
fflush(stdin);
continue;
} else {
break;
}
}
if ((num < min) || (num > max)) {
printf(m3, num);
} else {
break;
}
}
fflush(stdin);
return(num);
} /* readIntFromIO */