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.