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)