We are going to see, with this tutorial, how to create a shape on a window and how to move it with keyboard arrows.
We need, for this example, three files that we are going to create to dispatch the code:
main.c manager_sdl.c h.h Of course, you can add a Makefile to easily compile and link files.
But to link the .o, you need to add the -lSDL command.
1. main.c #include <string.h> #include <errno.h> #include <stdlib.h> #include <SDL/SDL.h> #include "h.h" int init(t_sdl *sdl) { if (SDL_Init(SDL_INIT_EVERYTHING) == -1) { fprintf(stderr, "Error: %s\n", strerror(errno)); return (1); } if ((sdl->screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE)) == NULL) { fprintf(stderr, "Error: %s", SDL_GetError()); return (1); } SDL_WM_SetCaption("Hello World! :D", NULL); if (SDL_FillRect(sdl->screen, NULL, SDL_MapRGB(sdl->screen->format, 255, 32, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_Flip(sdl->screen) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } sdl->position->x = 0; sdl->position->y = 0; if (manager_event(sdl)) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } SDL_FreeSurface(sdl->rectangle); return (0); } int main () { t_sdl sdl; sdl.screen = NULL; if(init(&sdl)) return (1); return (0); } 2. manager_sdl.c #include <stdio.h> #include <string.h> #include <SDL/SDL.h> #include "h.h" int manager_event(t_sdl *sdl) { int gogogo; SDL_Event event; gogogo = 1; while (gogogo) { SDL_WaitEvent(&event); if (event.type == SDL_QUIT) gogogo = 0; else if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) { printf("ESC\n"); gogogo = 0; } if (event.key.keysym.sym == SDLK_RIGHT) { printf("RIGHT\n"); sdl->position->x += 10; } if (event.key.keysym.sym == SDLK_LEFT) { printf("LEFT\n"); sdl->position->x -= 10; } if (event.key.keysym.sym == SDLK_UP) { printf("UP\n"); sdl->position->y -= 10; } if (event.key.keysym.sym == SDLK_DOWN) { printf("DOWN\n"); sdl->position->y += 10; } } creation_rect(sdl); } return (0); } int creation_rect(t_sdl *sdl) { sdl->rectangle = NULL; if (SDL_FillRect(sdl->screen, NULL, SDL_MapRGB(sdl->screen->format, 255, 32, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if ((sdl->rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 32, 0, 0, 0, 0)) == NULL) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_FillRect(sdl->rectangle, NULL, SDL_MapRGB(sdl->screen->format, 255, 255, 45)) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_BlitSurface(sdl->rectangle, NULL, sdl->screen, sdl->position) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } if (SDL_Flip(sdl->screen) == -1) { fprintf(stderr, "Error: %s\n", SDL_GetError()); return (1); } return (0); } 3. h.h #ifndef H_H_ #define H_H_ /** * STRUCTURE */ typedef struct s_sdl { SDL_Surface *screen; SDL_Surface *rectangle; SDL_Rect *position; } t_sdl; /** * PROTOTYPE */ /* main.c */ int init(t_sdl *sdl); /* manager_sdl.c */ int manager_event(t_sdl *sdl); int creation_rect(t_sdl *sdl); #endif /* H_H_ */ 4. Compiling, linking, running, playing $ gcc main.c manager_sdl.c -c ; gcc main.o manager_sdl.o -lSDL -o go ; ./go Well done, you made it.