Programmation en C - Étude du déplacement
Étude du déplacement
Introduction
Avant d'étudier le déplacement d'un personnage nous allons considérer le déplacement d'un simple rectangle.
Description du code
Nous allons créer deux fonctions de rafraichîssement. Une pour rafraîchir le fond blanc (update_map()) et une autre pour rafraîchir notre rectangle (update_perso()). Nous gérons ensuite les déplacements gauche, haut, droite et bas de notre rectangle avec les flèches du curseur dans la boucle infinie.
À chaque déplacement élémentaire, on rafraîchit la map et le rectangle puis on fait appel à la fonction SDL_RenderPresent() pour afficher le tout dans le moteur de rendu.
Code source
main.c
#include <SDL2/SDL.h> #define SIZE_RECT 32 void update_map(SDL_Renderer *renderer) { SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); } void update_perso(SDL_Renderer *renderer, SDL_Rect perso) { SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_RenderFillRect(renderer, &perso); SDL_RenderDrawRect(renderer, &perso); } int main() { SDL_Window *window; SDL_Event event; SDL_Renderer *renderer; int quit=0; SDL_Rect perso; perso.x = 32; perso.y = 32; perso.w = SIZE_RECT; perso.h = SIZE_RECT; SDL_Surface *surface_rect; surface_rect = SDL_CreateRGBSurfaceWithFormat(0, SIZE_RECT, SIZE_RECT, 32, SDL_PIXELFORMAT_RGBA32); if (surface_rect == NULL) { SDL_Log("Problem create rgb surface : %s", SDL_GetError()); exit(1); } if (SDL_VideoInit(NULL) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL video: %s\n", SDL_GetError()); exit(1); } window = SDL_CreateWindow("Fenetre", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_RenderFillRect(renderer, &perso); SDL_RenderDrawRect(renderer, &perso); SDL_RenderPresent(renderer); while ( !quit ) { if ( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_QUIT: quit=1; break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_LEFT: perso.x -=32; update_map(renderer); update_perso(renderer, perso); SDL_RenderPresent(renderer); break; case SDLK_RIGHT: perso.x +=32; update_map(renderer); update_perso(renderer, perso); SDL_RenderPresent(renderer); break; case SDLK_DOWN: perso.y +=32; update_map(renderer); update_perso(renderer, perso); SDL_RenderPresent(renderer); break; case SDLK_UP: perso.y -=32; update_map(renderer); update_perso(renderer, perso); SDL_RenderPresent(renderer); break; }//end switch event.key.keysym.sym break; }//end switch event.type }//end if PollEvent }//end while quit SDL_DestroyWindow(window); SDL_Quit(); return 0; }Pour compiler le programme, on tape dans le terminal
gcc main.c -o test -lSDL2
En tapant la commande ls, vous devriez voir un exécutable appelé test. Pour l'exécuter on tape:./test
Capture d'image
(Le carré bleu bouge en utilisant les touches du curseur)