[TUTO] SDL2.0 #2
-
Bonjour à tous !
ça fait un moment que j'en parle, voici la suite du premier cours sur la SDL2 !
malheureusement le temps me manque, le peu de temps dont je dispose, je n'ais pas de connexion internet.
la solution la plus simple est donc d'écrire le code source du cours en le SURcommentant

le code source qui vas suivre vous montre étape par étape comment animer le personnage de rayman
grâce a la SDL2.//pour le type bool #include <stdbool.h> //pour les atexit #include <stdlib.h> //pour les printf #include <stdio.h> //les includes SDL #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> int main () { //initialisation de la sdl if (SDL_Init (SDL_INIT_VIDEO) < 0) { printf("erreur SDL_Init: %s\n", SDL_GetError()); return EXIT_FAILURE; } atexit(SDL_Quit); //initialisation de la sdl_image if (IMG_Init(IMG_INIT_PNG) < 0) { printf("erreur IMG_Init: %s\n", SDL_GetError()); return EXIT_FAILURE; } atexit(IMG_Quit); //contexte d'affichage SDL_Window *screen; //tampon de rendu SDL_Renderer *renderer; //position de l'écran, de rayman et des différents sprites de rayman SDL_Rect pecran, prayman; SDL_Rect raymantiles[16]; unsigned int temps, tempsbride = 0, tempsanim = 0, index, anim = 0; bool droite = true; //initialisation des positions pecran.x = 0; pecran.y = 0; prayman.w = 120; prayman.h = 136; for(index = 0 ; index < 6 ; index++) { raymantiles[index].x = index*60; raymantiles[index].y = 1100; raymantiles[index].w = 60; raymantiles[index].h = 68; } for(index = 0 ; index < 6 ; index++) { raymantiles[index+6].x = index*60; raymantiles[index+6].y = 68+1100; raymantiles[index+6].w = 60; raymantiles[index+6].h = 68; } for(index = 0 ; index < 4 ; index++) { raymantiles[index+12].x = index*60; raymantiles[index+12].y = 136+1100; raymantiles[index+12].w = 60; raymantiles[index+12].h = 68; } //suppression du curseur de souris SDL_ShowCursor(SDL_DISABLE); //création de la fenêtre screen = SDL_CreateWindow("Rayman_like", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP); //création du tampon de rendu renderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED); //récupération de la taille de l'écran SDL_GetWindowSize(screen , &pecran.w , &pecran.h); //mise en position de rayman prayman.x = (pecran.w/2)-(prayman.w/2); prayman.y = (pecran.h*0.65)-(prayman.w/2); // chargement des images SDL_Texture *fond = IMG_LoadTexture(renderer, "fond.jpg"); SDL_Texture *rayman = IMG_LoadTexture(renderer, "rayman.png"); //test d'erreur a la création de la fenêtre, du tampon de rendu et des images. (fonction critiques qui peuvent rencontrer des erreurs if (screen == NULL || renderer == NULL || fond == NULL || rayman == NULL) { printf("erreur: %s\n", SDL_GetError()); return EXIT_FAILURE; } //entrée en boucle principale while(1) { //récupération du temps temps = SDL_GetTicks(); //si le programme tourne depuis "x" ms, on quitte; if (temps >= 7000) { break; } //test pour changer le sprite d'animation si "x" ms sont écoulées if (temps - tempsanim >= 60) { //sauvegarde du temps actuel pour la prochaine itération tempsanim = temps; //sprite suivant anim++; //si le dernier sprite est atteint, on reviens au premier if(anim == 16){anim = 0;} } //bride pour sinchro ecran ~60fps if (temps - tempsbride >= 16) { //assignation du temps actuel pour la prochaine itération tempsbride = temps; //si rayman touche la bordure d'écran a droite, il fait demi tour ! if (prayman.x + prayman.w >= pecran.w) { droite = false; } //si il touche la bordure gauche, il fait de même. else if (prayman.x <= 0) {droite = true;} //vidage du tampon de rendu SDL_RenderClear(renderer); //copie du fond sur le tampon SDL_RenderCopy(renderer, fond, NULL, &pecran); //si rayman vas à gauche if (!droite) { //décrémentation horizontale de la position de rayman. prayman.x -= 5; //copie de rayman (en inversant le sens de l'image) sur le tampon SDL_RenderCopyEx(renderer, rayman, &raymantiles[anim], &prayman, 0,NULL, SDL_FLIP_HORIZONTAL); } //sinon else { //incrémentation horizontale de la position de rayman. prayman.x += 5; //copie de rayman sur le tampon SDL_RenderCopy(renderer, rayman, &raymantiles[anim], &prayman); } //affichage du tampon de rendu sur l'écran. SDL_RenderPresent(renderer); } else { // si l'écran ne suis pas, ont fait une pause. // cela permet de grandement libérer le CPU. SDL_Delay(5); } } //programme terminé return EXIT_SUCCESS; }si vous compilez chez vous, vous devriez avoir un résultat s'approchant de ça:
pour tout commentaire ou question, je suis présent pour vous répondre

voici les fichiers pour ceux qui voudrais le compiler et le modifier pour s’entraîner ----> ICI
-
Merci du partage, pratique et bien utile quand on veut se mettre à la pratique.

+1 rep. -
Je regarde ton code petit à petit
.Une simple question: Par rapport à la SDL 1.2, il faut initialiser les bibliothèques extérieurs comme la sdl_image ou bien c'est pour que ton code soit plus "propre" ?
//initialisation de la sdl_image if (IMG_Init(IMG_INIT_PNG) < 0) { printf("erreur IMG_Init: %s\n", SDL_GetError()); return EXIT_FAILURE; } atexit(IMG_Quit); -
c'est exactement comme la 1.2 il faut les initialiser et les fermer a la fin.
par contre fait attention a initialiser la SDL en premier et a la fermer en dernier.
si tu initialise img, ttf, net ou mixer avant la SDL, ça ne marche pas.
Bonjour ! Vous semblez intéressé par cette conversation, mais vous n’avez pas encore de compte.
Marre de refaire défiler les mêmes messages ? Créez un compte pour retrouver votre position, recevoir des notifications des nouvelles réponses, sauvegarder vos favoris et voter pour les messages que vous appréciez.
Grâce à votre participation, ce message peut devenir encore meilleur 💗
S'inscrire Se connecter