Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
World of Madness

Ce monde de folie est-il le vôtre ?

Faire défiler un arrière plan avec la SDL

Faire défiler un arrière plan avec la SDL

Adeptes de programmation, je vais vous parler ici d'un petit problème qui m'a occupé pendant une bonne heure alors que j'aidais un ami à programmer son jeu de plateforme "à la Mario".

Cet article sera un peu technique. Si vous n'êtes pas intéressé par la programmation ou que vous n'avez aucune notion en C je vous conseille de ne pas perdre 10 minutes de votre vie et de passer votre chemin.

Je précise que nous en codions en C avec CodeBlocks et que nous utilisions la bibliothèque SDL.

Le problème était le suivant : Comment faire défiler un arrière plan (afin de donner l'impression que le personnage avance ou recule) sachant que la fonction SDL_BlitSurface() ne semble pas prendre en compte les coordonnées négatives ?

Je vais ici vous présenter humblement ma solution afin que vous puissiez ne pas rester bloqués comme moi pendant une heure sur ce problème.

La sale manie de SDL_BlitSurface()

Bonne nouvelle pour nous, la fonction SDL_BlitSurface() prend bel et bien en compte les coordonnées négatives ! Le problème réside simplement dans le fait que cette fonction a pris une mauvaise habitude. Lorsque vous lui envoyez des coordonnées négatives elle blit bien la surface comme vous lui avez demandé mais remet inexplicablement (à mon niveau du moins) toutes les coordonnées à 0 ! Bien sûr, cela anihile complètement nos chances de faire défiler correctement un arrière plan en utilisant cette fonction de manière usuelle.

La solution est donc de berner la fonction.

Une copie des coordonnées comme leurre

Vous avez, pour utiliser la fonction SDL_BlitSurface(), créé les coordonnées de votre arrière plan de cette manière :

SDL_Rect positionFond; positionFond.x = 0; positionFond.y = 0;

La solution est de créer un leurre sur le même modèle :

SDL_Rect positionFondCopie; positionFondCopie.x = 0; positionFondCopie.y = 0;

Ainsi vous enverrez toujours les coordonnées positionFondCopie ayant pris les valeurs des coordonnées positionFond dans la fonction SDL_BlitSurface() de cette manière :

positionFondCopie.x = positionFond.x;

SDL_BlitSurface(arrierePlan, NULL, ecran, &positionFondCopie);

Ainsi ce sont les coordonnées positionFondCopie qui seront remises à 0 tandis que nos vraies coordonnées pourront continuer à être décrémenter dans les négatifs par exemple.

Et concrètement ?

Vous ne voyez toujours pas comment cela peut solutionner votre problème ? Alors voilà ce que pourrait donner le code du défilement de l'arrière plan vers la gauche pour donner l'impression que votre personnage avance :

switch(event.type) {

case SDL_KEYDOWN:

switch(event.key.keysym.sym) {

case SDLK_RIGHT:

positionFond.x = positionFond.x - 10;

positionFondCopie.x = positionFond.x;

SDL_BlitSurface(arrierePlan, NULL, ecran, &positionFondCopie);

}

}

Je précise que ce bout de code n'est que la partie qui gère le défilement de l'arrière plan vers la gauche quand on appuie sur la flèche de droite !

Conclusion

Voilà donc la solution que je préconise pour dompter la particularité de cette fonction ! Il en existe sans doute d'autres alors libre à vous de faire d'autres recherches. J'espère en tout cas que si vous étiez confronter au même problème que moi j'ai pu vous aider et vous faire gagner du temps.

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
J
merci tu viens de me sauver la vie m'ai j'ai un probleme au niveau du defilement verticale quand j'applique ta methode elle fonctionne mais avec un leger probleme en effet si je defile horizontalement vers la droite des que je decide de defiler vers le bas dans les normes le defilement dois commencer à partir du dernier coordonnées de la droite mais ce n'est pas le cas ca me ramene a camera.x=0 et camera.y=0 puis ca defilement vers le bas
Répondre