User Tools

Site Tools


projtec:sdl2

SDL2

SDL2 est un blibliothèque qui permet de développer des applications graphiques, comme de jeux 2D. Un des points fort de SDL2 est incontestablement sa simplicité et sa portabilité sous Android !

Voici quelques tuoriels utiles pour bien commençer :

Nous proposons ici un modèle de programme avec SDL2, et une petit exemple d'utilisation de ce modèle. La démo montre diverses possibilités de SDL2, comme le texte TTF, les textures transparentes en PNG, … Vous trouverez tout cela dans l'archive : sdl2-demo.zip. Lire le README.txt pour démarrer.

Un Modèle de Programme SDL2

Notre modèle se compose de trois fichiers : main.c, model.h et model.c. Le fichier main.c contient le programme principal avec la boucle d'évènements. Il s'appuie sur les quatre fonctions declarées dans model.h et qu'il faut ensuite implanter dans model.c.

  • La fonction init() permet l'initialisation de la structure Env qui contient toutes les variables utiles à votre programme, comme par exemple les textures SDL.
  • La fonction clean() permet principalement de terminer votre programme, en libérant les allocations mémoire effectuées dans la phase d'initialisation.
  • La fonction process() est appelée dans la boucle principale de votre programme, afin de traiter tous les èvenements SDL2 (souris, clavier, …).
  • La fonction render() est appelée dans la boucle principale de votre programme, afin d’effectuer le rendu graphique des différents éléments (textures, …).

Voici la déclaration des fonctions utiles à notre modèle :

model.h
// SDL2 Model by aurelien.esnard@u-bordeaux.fr
 
#ifndef MODEL_H
#define MODEL_H
 
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdbool.h>
 
typedef struct Env_t Env;
 
/* **************************************************************** */
 
#define APP_NAME "Hello World!"
#define SCREEN_WIDTH 600
#define SCREEN_HEIGHT 600
 
/* **************************************************************** */
 
#ifdef __ANDROID__ 
#define PRINT(STR, ...) do { SDL_Log(STR, ##__VA_ARGS__);  } while(0)
#define ERROR(STR, ...) do { SDL_Log(STR, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) 
# else
#define PRINT(STR, ...) do { printf(STR, ##__VA_ARGS__); } while(0)
#define ERROR(STR, ...) do { fprintf(stderr, STR, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0)
#endif
 
/* **************************************************************** */
 
Env * init(SDL_Window* win, SDL_Renderer* ren, int argc, char* argv[]);
void render(SDL_Window* win, SDL_Renderer* ren, Env * env);
void clean(SDL_Window* win, SDL_Renderer* ren, Env * env);
bool process(SDL_Window* win, SDL_Renderer* ren, Env * env, SDL_Event * e);
 
/* **************************************************************** */
 
#endif

Voici le code du programme principal :

main.c
// SDL2 Demo by aurelien.esnard@u-bordeaux.fr
 
#include <SDL.h>
#include <SDL_image.h>  // required to load transparent texture from PNG
#include <SDL_ttf.h>    // required to use TTF fonts     
#include <stdio.h>
#include <stdbool.h>
#include "model.h"
 
/* **************************************************************** */
 
int main(int argc, char * argv[])
{ 
  /* initialize SDL2 and some extensions */
  if(SDL_Init(SDL_INIT_VIDEO) != 0) ERROR("Error: SDL_Init VIDEO (%s)", SDL_GetError());  
  if(IMG_Init(IMG_INIT_PNG & IMG_INIT_PNG) != IMG_INIT_PNG) ERROR("Error: IMG_Init PNG (%s)", SDL_GetError());  
  if(TTF_Init() != 0) ERROR("Error: TTF_Init (%s)", SDL_GetError());  
 
  /* create window and renderer */
  SDL_Window * win = SDL_CreateWindow(APP_NAME, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
    				      SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
  if(!win) ERROR("Error: SDL_CreateWindow (%s)", SDL_GetError());  
  SDL_Renderer * ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  if(!ren) ERROR("Error: SDL_CreateRenderer (%s)", SDL_GetError());  
 
  /* initialize your environment */
  Env * env = init(win, ren, argc, argv);
 
  /* main render loop */
  bool quit = false;
  while (!quit) {
 
    /* manage events */
    SDL_Event e;
    while (SDL_PollEvent(&e)) {
      /* process your events */
      quit = process(win, ren, env, &e);
      if(quit) break;
    }
 
    /* background in gray */
    SDL_SetRenderDrawColor(ren, 0xA0, 0xA0, 0xA0, 0xFF); 
    SDL_RenderClear(ren);
 
    /* render all what you want */    
    render(win, ren, env); 
    SDL_RenderPresent(ren);
    SDL_Delay(10);
  }
 
  /* clean your environment */
  clean(win, ren, env);
 
  SDL_DestroyRenderer(ren);
  SDL_DestroyWindow(win);
  IMG_Quit();
  TTF_Quit();  
  SDL_Quit();
 
  return EXIT_SUCCESS;
}

Et voici une coquille vide pour implanter les fonctions de notre modèle :

model.c
// SDL2 Demo by aurelien.esnard@u-bordeaux.fr
 
#include <SDL.h>
#include <SDL_image.h>  // required to load transparent texture from PNG
#include <SDL_ttf.h>    // required to use TTF fonts     
 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "model.h"
 
/* **************************************************************** */
 
struct Env_t {  
 
  /* PUT YOUR VARIABLES HERE */
 
}; 
 
/* **************************************************************** */
 
Env * init(SDL_Window* win, SDL_Renderer* ren, int argc, char* argv[])
{  
  Env * env = malloc(sizeof(struct Env_t));
 
  /* PUT YOUR CODE HERE TO INIT TEXTURES, ... */
 
  return env;
}
 
/* **************************************************************** */
 
void render(SDL_Window* win, SDL_Renderer* ren, Env * env)
{
  /* PUT YOUR CODE HERE TO RENDER TEXTURES, ... */
}
 
/* **************************************************************** */
 
 
bool process(SDL_Window* win, SDL_Renderer* ren, Env * env, SDL_Event * e)
{     
 
  if (e->type == SDL_QUIT) {
    return true;
  }
 
  /* PUT YOUR CODE HERE TO PROCESS EVENTS */
 
  return false; 
}
 
/* **************************************************************** */
 
void clean(SDL_Window* win, SDL_Renderer* ren, Env * env)
{
  /* PUT YOUR CODE HERE TO CLEAN MEMORY */
 
  free(env);
}

Portage sous Android

Le code proposé ci-dessus est 100% portable sous Android : c'est ici !

projtec/sdl2.txt · Last modified: 2024/03/18 15:06 by 127.0.0.1