#include #include #include struct game { bool gameover; int screen_width; int screen_height; uint8_t r; uint8_t g; uint8_t b; uint32_t argb; SDL_Window * window; SDL_Renderer * renderer; SDL_Surface * screen; SDL_Event * event; }; struct game * game_init (void); void game_handle_input (struct game * game); void game_update (struct game * game); void game_render (struct game * game); void game_destroy (struct game * game); int main(int argc, char *argv[]) { struct game * game = game_init(); while(!game->gameover) { game_handle_input(game); game_update(game); game_render(game); } game_destroy(game); SDL_Log("Exiting\n"); return 0; } struct game * game_init(void) { int retval; struct game *game = malloc(sizeof *game); game->gameover = false; game->screen_width = 1280; game->screen_height = 720; game->r = 0; game->g = 0; game->b = 0; game->argb = 0; retval = SDL_Init(SDL_INIT_EVERYTHING); if(retval < 0) { SDL_LogError (SDL_LOG_CATEGORY_APPLICATION, "SDL_Init: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } atexit(SDL_Quit); game->window = SDL_CreateWindow("Game: Init", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, game->screen_width, game->screen_height, 0); if(game->window == NULL) { SDL_LogError (SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateWindow: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } game->renderer = SDL_CreateRenderer(game->window, -1, SDL_RENDERER_ACCELERATED); if(game->renderer == NULL) { SDL_LogError (SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateRenderer: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_RendererInfo info; SDL_GetRendererInfo(game->renderer, &info ); SDL_Log("Renderer Name: %s\n", info.name); SDL_Log("Texture formats: \n"); for (size_t i = 0; i < info.num_texture_formats; i++) { SDL_Log("%s\n", SDL_GetPixelFormatName(info.texture_formats[i])); } game->event = malloc(sizeof (game->event)); return game; } void game_handle_input(struct game * game) { while(SDL_PollEvent(game->event)) { switch(game->event->type) { case SDL_QUIT: game->gameover = true; break; case SDL_KEYDOWN: switch(game->event->key.keysym.sym) { case SDLK_ESCAPE: game->gameover = true; break; } } } } void game_update(struct game *game) { game->r = (game->argb) & 0xff; game->g = (game->argb >> 8) & 0xff; game->b = (game->argb >> 16) & 0xff; game->argb++; } void game_render(struct game *game) { int retval; retval = SDL_SetRenderDrawColor (game->renderer, game->r, game->g, game->b, 255); if(retval < 0) { SDL_Log("SDL_SetRenderDrawColor: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } retval = SDL_RenderClear(game->renderer); if(retval < 0) { SDL_Log("SDL_RenderClear: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_RenderPresent(game->renderer); } void game_destroy(struct game *game) { if(game->renderer != NULL) { SDL_Log("Destroying renderer()\n"); SDL_DestroyRenderer(game->renderer); game->renderer = NULL; } if(game->window != NULL) { SDL_Log("Destroying main window()\n"); SDL_DestroyWindow (game->window); game->window = NULL; } if(game != NULL) { SDL_Log("Destroying game\n"); free(game); } }