Here is a rather simple program demonstrating a game event loop using SDL2:
#include <SDL.h>
#include <stdio.h>
void on_render(SDL_Window* window, SDL_Renderer* renderer);
int main(int argc, char** argv)
{
SDL_Window *mainwindow = NULL;
SDL_Renderer *renderer = NULL;
SDL_Event event = { 0 };
int exit = 0; // If 1, the event loop will break.
// INITIALIZE SDL (VIDEO ONLY):
if(SDL_Init(SDL_INIT_VIDEO) == -1) {
printf("SDL_Init() failed with \"%s.\"", SDL_GetError());
return 1;
}
// CREATE WINDOW:
mainwindow = SDL_CreateWindow("SDL2 Application", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if(!mainwindow) {
printf("SDL_CreateWindow() failed with \"%s.\"", SDL_GetError());
return -1;
}
// CREATE RENDERER:
renderer = SDL_CreateRenderer(mainwindow, -1, SDL_RENDERER_ACCELERATED);
if(!renderer) {
printf("SDL_CreateRenderer() failed with \"%s.\"", SDL_GetError());
return -1;
}
// MAIN LOOP:
while(!exit) {
// EVENT LOOP:
if(SDL_WaitEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
exit = 1;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE) exit = 1;
break;
case SDL_WINDOWEVENT:
switch(event.window.event) {
case SDL_WINDOWEVENT_CLOSE:
exit = 1;
break;
}
break;
default: break;
}
}
// RENDER SCREEN:
on_render(mainwindow, renderer);
// SWAP BUFFERS TO DISPLAY:
SDL_RenderPresent(renderer);
}
// CLEAN-UP:
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(mainwindow);
SDL_Quit();
return 0;
}
void on_render(SDL_Window* window, SDL_Renderer* renderer)
{
int rect_width = 300, rect_height = 300;
SDL_Rect window_rect = { 0 };
// CLEAR THE SCREEN WITH A BLUE COLOR:
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
// DRAW A RECTANGLE:
SDL_GetWindowSize(window, &window_rect.w, &window_rect.h);
SDL_Rect draw_rect = {
(window_rect.x + (window_rect.w / 2) - (rect_width / 2)) - 1,
(window_rect.y + (window_rect.h / 2) - (rect_height / 2)) - 1,
rect_width + 2,
rect_height + 2
};
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, &draw_rect);
}
Credit: Xeek
on freenode
wrote this for me when I went over to ask about event loops.
Now, if you aren't writing a game, perhaps you do not want to consume all of the CPU time, in which case a simple
usleep (1);
right before the end of the outermost while
loop should cut it.
Using your code, here is an example (which happens to depend on having a POSIXy system (Linux, OSX, etc.):
// includes and defines
#include <unistd.h> // usleep() is defined here
...
int main (int argc, char **argv) {
// setup and stuff
...
int exit = 0;
while (!exit) {
if ((GetAsyncKeyState(keyID) & 0x8000) == 0x8000) {
// handle the input or whatever
...
}
// check if it is time to exit yet
if (some exit condition) {
exit = 1;
}
usleep (100); // sleep for 100 us
}
// cleanup
...
return 0;
}
EDIT:
us is microseconds, not milliseconds. Silly me :)