Se connecter / S'enregistrer
Votre question

[C] Dégradé d'alpha. je comprends pas pourquoi ca bug (la mémoire je pense)

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
27 Mars 2006 19:36:15

Bonjour tout le monde. Comme vous devez commencer à le savoir à force de voir mes topics, j'essai de faire un petit jeu en C, ca avance grâce à vos aide et au café ^^ mais je coince un peu je dois le reconnaître.
Pour le moment je n'en suis qu'à affichier la map qui se compose attention de 5 textures différentes (oui oui, vous avez bien entendu 5 textures différentes !). Mon programme va lire un fichier texte caractere par caractere et attribut a chacun d'entre eux une texture (ex: f -> foret.bmp). Le problème c'est que ca fait des ruptures pas tres belles entre par exemple le sable et la terre (vu que c'est par case). Je me suis alors dis pourquoi ne pas faire des dégradés entre les textures en fonction de la texture suivant, précédente, du dessus et du dessous. C'est la que ca se complique, j'ai d'abord commencé par faire charger la texture en fonction de la texture suivante et précédente mais j'en suis a 125 possibilités différentes (c-a-d 125 textures faîtes moi même). Je vous laisse imaginer avec celle du dessus et du dessous en plus......

j'ai donc essayer quelque chose :
- faire un dégradé de la texture en utilisant le alpha (15 surfaces de 1 pixel de largeur avec un alpha variant) avec en dessous la couleur de la texture précédente.

ca fonctionne a peu pres lorsque je mets pour un dégradé, mais ca plante lorsque je mets pour celui de l'autre cote.... l'erreur est au niveau du

  1. while(m<=15)

je vous donne mon code avant que vous dormiez :

  1. /*
  2. c'est le code pour générer un dégradé entre deux cases ce qui évite de devoir faire toutes les textures soit meme.
  3. Plusieurs problèmes :
  4. - le programme bug lorsque je veux aller plus loin qu'un \n
  5. - le programme bug lorsque je mets un dégradé à la fois a gauche et a droite (je ne sais pas pourquoi), il fonctionne lorsque je mets seulement a gauche (pb avec le K je pense).
  6. */
  7.  
  8. #define HAUTEUR_CASE 75
  9. #define LARGEUR_CASE 75
  10.  
  11. ...
  12.  
  13. position.y = i * HAUTEUR_CASE;
  14. position.x = j * LARGEUR_CASE + 15;
  15. positionTranslation.y = i * HAUTEUR_CASE;
  16. positionTranslation.x = j * LARGEUR_CASE;
  17. positionDessin.y = i * HAUTEUR_CASE;
  18. positionDessin.x = j * LARGEUR_CASE;
  19.  
  20. appliqueTextureTerrain(caracterePrecedent, caractereActuel, caractereSuivant, texture);
  21.  
  22. translation[l] = SDL_CreateRGBSurface(SDL_HWSURFACE, 15, HAUTEUR_CASE, 32, 0, 0, 0, 0);
  23. SDL_FillRect(translation[l], NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* ici c'est pour un test sinon il faut une fonction qui applique la couleur de 'translation' en fonction des textures des cotes.*/
  24. SDL_BlitSurface(translation[l], NULL, ecran, &positionTranslation);
  25.  
  26. m = 0;
  27.  
  28. while(m <=15)
  29. {
  30. position.x = j * LARGEUR_CASE + m;
  31. carreau[k] = SDL_CreateRGBSurface(SDL_HWSURFACE, 1 , HAUTEUR_CASE, 32, 0, 0, 0, 0);
  32. carreau[k] = IMG_Load(texture); //on applique la texture à la case.
  33. SDL_SetAlpha(carreau[k], SDL_SRCALPHA, a);
  34. SDL_BlitSurface(carreau[k], NULL, ecran, &position);
  35. a += 17;
  36. m++;
  37. k++;
  38. }
  39.  
  40.  
  41.  
  42.  
  43. carreau[k] = SDL_CreateRGBSurface(SDL_HWSURFACE, 45 , HAUTEUR_CASE, 32, 0, 0, 0, 0);
  44. carreau[k] = IMG_Load(texture); //on applique la texture à la case.
  45. SDL_BlitSurface(carreau[k], NULL, ecran, &position);
  46. k++;
  47.  
  48. m = 0;
  49. while(m <= 15)
  50. {
  51. position.x = j * LARGEUR_CASE + 60 + m;
  52. carreau[k] = SDL_CreateRGBSurface(SDL_HWSURFACE, 1 , HAUTEUR_CASE, 32, 0, 0, 0, 0);
  53. carreau[k] = IMG_Load(texture); //on applique la texture à la case.
  54. SDL_SetAlpha(carreau[k], SDL_SRCALPHA, a);
  55. SDL_BlitSurface(carreau[k], NULL, ecran, &position);
  56. a -= 17;
  57. m++;
  58. k++;
  59. } // meme degrade mais de l'autre cote
  60.  
  61. appliqueDessinTerrain(caractereActuel, charDessin);
  62. SDL_CreateRGBSurface(SDL_HWSURFACE, LARGEUR_CASE , HAUTEUR_CASE, 32, 0, 0, 0, 0);
  63. dessin[k] = IMG_Load(charDessin);
  64. SDL_BlitSurface(dessin[k], NULL, ecran, &positionDessin);
  65. j++;
  66. k++;
  67. l++;
  68. }
  69. carreauMax = k;
  70. k = 0;
  71. while(k<=carreauMax)
  72. {
  73. SDL_FreeSurface(dessin[k]);
  74. SDL_FreeSurface(carreau[k]);
  75. SDL_FreeSurface(translation[k]);
  76. k++;
  77. }
  78.  
  79. }
  80.  
  81. ...


j'ai pas tout mis pcq je sais a peu pres ou est l'erreur mais hésitez pas à me demander le reste si ca peut vous aider.

merci d'avance et de m'avoir lu ! !

Autres pages sur : degrade alpha comprends bug memoire pense

a b L Programmation
27 Mars 2006 20:12:40

Si tu as un crash c'est que tu as eu un plantage de lecture en dehors d'une zone mémoire réservé.
Je sens bien un problème avec le tableau "carreau". Comment l'as-tu initialisé ? avec au moins 32 éléments ? à commbien commence-t-il ?
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS