1 Novembre 2012
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.
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.
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.
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 !
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.