Nous allons repartir du code de l’exercice précédent.
Dans cet exerice, nous allons découvrir plusieurs aspects de la librairie SDL2:
- Dessiner un objet à l’écran (sur le fond noir du SDL_Renderer)
- Récupérer l’état des touches du clavier
- Gérer le “frame rate” afin que les images soient affichées à intervalle fixe dans le temps
Note: Un bon exemple de tout cela se trouve dans le code du jeu Pong, écrit en Langage C par le binome 23 du projet-2: https://github.com/joachim-gabin/gtech1-b23-pong
Voir:
- fr.wikibooks.org: “Programmation avec la SDL”
- wiki.libsdl.org:
- SDL_Rect: Structure C pour dessiner un rectangle
- SDL_RenderDrawRect: Fonction SDL2 pour dessiner un SDL_Rect
Documentation: https://wiki.libsdl.org/SDL_GetKeyboardState
Le principe est de:
- Récupérer la table d’état des touches du clavier:
(
SDL_GetKeyboardState()
):const Uint8 *keystates = SDL_GetKeyboardState(NULL);
- Vérifier si la touche qui nous intéresse est pressée ou non:
keystates[SDL_SCANCODE_UP]
Dans cet exemple:
SDL_SCANCODE_UP
est le code de la touche “UP” (flèche ↑ des quatre touches ← → ↑ ↓ du clavier)keystates[SDL_SCANCODE_UP]
s’évalue à VRAI si la touche est pressée, FAUX autrement
#include <SDL2/SDL.h>
void keyboard() {
const Uint8 *keystates = SDL_GetKeyboardState(NULL);
if (keystates[SDL_SCANCODE_UP]) {
...
}
if (keystates[SDL_SCANCODE_DOWN]) {
...
}
if (keystates[SDL_SCANCODE_LEFT]) {
...
}
if (keystates[SDL_SCANCODE_RIGHT]) {
...
}
}
Voir:
- wiki.libsdl.org:
- SDL_GetTicks: “Get the number of milliseconds since SDL library initialization.”
- SDL_Delay: “Wait a specified number of milliseconds before returning.”
Note: On pourra fixer le frame rate à 50 images/second (50Hz), soit 1/50 = 20ms.
// En début de programme, fixer le framrate désiré (en ms):
Uint32 frame_rate = ...;
// En début de frame:
// Récupérer le temps (en ms) depuis le démarrage de la SDL2:
Uint32 frame_time_start = SDL_GetTicks();
...
// En fin de frame:
// Calcul de l'intervalle écoulé depuis frame_time_start:
frame_time_interval = SDL_GetTicks() - frame_time_start;
...
// Attendre le temps nécessaire (si la frame a duré moins de =frame_rate= millisecondes):
SDL_Delay(...);