[C] J'essaye de me faire une petite bibliothèques de fonction avec SDL

J'essaye de me faire une petite bibliothèques de fonction avec SDL [C] - C - Programmation

Marsh Posté le 26-11-2008 à 09:46:01    

Salut,
 
J'essaye de me faire une petite bibliothèques de fonctions (ou procédures plutôt) graphique avec la SDL, mais je rencontre un problème.
C'est la première fois que j'utilise SDL et que je fais plusieurs fichier donc j'ai un peu de mal.
Les fonctions ne sont pas toutes de moi, je les ai prises sur developpez.com. (évidemment elles sont libres de droits).
 
Donc voici mes fichiers:
 
graphique.c:

Code :
  1. #include <SDL/SDL.h>
  2. #include "graphique.h"
  3. /*nom du pointeur (de type SDL_Surface) qui va stocker la surface qui correspond à toute la fenêtre,
  4.   utilisé dans quasiment toutes les fonctions de ce fichier. Il faudra donc pour utiliser la plupart  
  5.   des modules de ce fichier récupérer le pointeur renvoyé par SDL_SetVideoMode
  6. */
  7. #define POINTEUR_SURFACE ecran
  8. SDL_Surface* POINTEUR_SURFACE;
  9. enum
  10. {
  11.   C_NOIR, C_BLEU_FONCE, C_VERT_FONCE, C_CYAN_FONCE, C_ROUGE_FONCE,
  12.   C_MAGENTA_FONCE, C_OCRE, C_GRIS_CLAIR, C_GRIS, C_BLEU, C_VERT,
  13.   C_CYAN, C_ROUGE, C_MAGENTA, C_JAUNE, C_BLANC,
  14.   NB_COULEURS
  15. };
  16. /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
  17.   Données: Aucunes
  18.   Précondition: Avoir initialisé la SDL
  19. */
  20. Uint32 couleurs[NB_COULEURS]; /*tableau global servant à la fonction */
  21. void initCouleurs(SDL_Surface *v_ecran)
  22. {
  23.   couleurs[C_NOIR]          = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x00);
  24.   couleurs[C_BLEU_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x80);
  25.   couleurs[C_VERT_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x00);
  26.   couleurs[C_CYAN_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x80);
  27.   couleurs[C_ROUGE_FONCE]   = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x00);
  28.   couleurs[C_MAGENTA_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x80);
  29.   couleurs[C_OCRE]          = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x00);
  30.   couleurs[C_GRIS_CLAIR]    = SDL_MapRGB(v_ecran->format, 0xC0, 0xC0, 0xC0);
  31.   couleurs[C_GRIS]          = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x80);
  32.   couleurs[C_BLEU]          = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0xFF);
  33.   couleurs[C_VERT]          = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0x00);
  34.   couleurs[C_CYAN]          = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0xFF);
  35.   couleurs[C_ROUGE]         = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0x00);
  36.   couleurs[C_MAGENTA]       = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0xFF);
  37.   couleurs[C_JAUNE]         = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0x00);
  38.   couleurs[C_BLANC]         = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0xFF);
  39. }
  40. /*Procédure: Affiche un pixel de couleur donnée
  41.   Données: Coordonées du pixel et code couleur
  42.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
  43.                 les coordonnées du pixel doivent se situer dans la fenêtre
  44. */
  45. void setPixel(int x, int y, Uint32 coul)
  46. {
  47.   *((Uint32*)(POINTEUR_SURFACE->pixels) + x + y * POINTEUR_SURFACE->w) = coul;
  48. }
  49. /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
  50.   Données: Coordonées du pixel et code couleur
  51.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
  52. */
  53. void setPixelVerif(int x, int y, Uint32 coul)
  54. {
  55.   if (x >= 0 && x < POINTEUR_SURFACE->w &&
  56.       y >= 0 && y < POINTEUR_SURFACE->h)
  57.     setPixel(x, y, coul);
  58. }
  59. /*Procédure: Affiche une barre de dimensions données
  60.   Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
  61.   Préconditions: Avoir initialisé la SDL et le mode graphique
  62. */
  63. void barre(int x, int y, int w, int h, Uint32 coul)
  64. {
  65.   SDL_Rect r;
  66.   r.x = x;
  67.   r.y = y;
  68.   r.w = w;
  69.   r.h = h;
  70.   SDL_FillRect(POINTEUR_SURFACE, &r, coul);
  71. }
  72. /*Procédure: Remplit la fenêtre en noir
  73.   Données: Aucunes
  74.   Préconditions: Avoir initialisé la SDL et le mode graphique
  75. */
  76. void effacerEcran(void)
  77. {
  78.   SDL_FillRect(POINTEUR_SURFACE, NULL, couleurs[C_NOIR]);
  79. }
  80. /*Procédure: Trace une ligne horizontale
  81.   Données: Coordonnées du point gauche, longueur de la ligne, code couleur
  82.   Préconditions: Avoir initialisé la SDL et le mode graphique
  83. */
  84. void ligneHorizontale(int x, int y, int w, Uint32 coul)
  85. {
  86.   SDL_Rect r;
  87.   r.x = x;
  88.   r.y = y;
  89.   r.w = w;
  90.   r.h = 1;
  91.   SDL_FillRect(POINTEUR_SURFACE, &r, coul);
  92. }
  93. /*Procédure: Trace une ligne verticale
  94.   Données: Coordonnées du point haut, hauteur de la ligne, code couleur
  95.   Préconditions: Avoir initialisé la SDL et le mode graphique
  96. */
  97. void ligneVerticale(int x, int y, int h, Uint32 coul)
  98. {
  99.   SDL_Rect r;
  100.   r.x = x;
  101.   r.y = y;
  102.   r.w = 1;
  103.   r.h = h;
  104.   SDL_FillRect(POINTEUR_SURFACE, &r, coul);
  105. }
  106. /*Procédure: Trace un rectangle
  107.   Données: Coordonnées du point supérieur gauche, largeur, hauteur
  108.   Préconditions: Avoir initialisé la SDL et le mode graphique
  109. */
  110. void rectangle(int x, int y, int w, int h, Uint32 coul)
  111. {
  112.   ligneHorizontale(x, y, w, coul);
  113.   ligneHorizontale(x, y + h - 1, w, coul);
  114.   ligneVerticale(x, y + 1, h - 2, coul);
  115.   ligneVerticale(x + w - 1, y + 1, h - 2, coul);
  116. }
  117. /*Procédure: Trace un cercle
  118.   Données: Coordonnées du centre, rayon et code couleur
  119.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
  120. */
  121. void cercle(int cx, int cy, int rayon, int coul)
  122. {
  123.   int d, y, x;
  124.   d = 3 - (2 * rayon);
  125.   x = 0;
  126.   y = rayon;
  127.   while (y >= x) {
  128.     setPixelVerif(cx + x, cy + y, coul);
  129.     setPixelVerif(cx + y, cy + x, coul);
  130.     setPixelVerif(cx - x, cy + y, coul);
  131.     setPixelVerif(cx - y, cy + x, coul);
  132.     setPixelVerif(cx + x, cy - y, coul);
  133.     setPixelVerif(cx + y, cy - x, coul);
  134.     setPixelVerif(cx - x, cy - y, coul);
  135.     setPixelVerif(cx - y, cy - x, coul);
  136.     if (d < 0)
  137.       d = d + (4 * x) + 6;
  138.     else {
  139.       d = d + 4 * (x - y) + 10;
  140.       y--;
  141.     }
  142.     x++;
  143.   }
  144. }
  145. /*Procédure: Trace un disque
  146.   Données: Coordonnées du centre, rayon et code couleur
  147.   Préconditions: Avoir initialisé la SDL et le mode graphique  
  148. */
  149. void disque(int cx, int cy, int rayon, int coul)
  150. {
  151.   int d, y, x;
  152.   d = 3 - (2 * rayon);
  153.   x = 0;
  154.   y = rayon;
  155.   while (y >= x) {
  156.     ligneHorizontale(cx - x, cy - y, 2 * x + 1, coul);
  157.     ligneHorizontale(cx - x, cy + y, 2 * x + 1, coul);
  158.     ligneHorizontale(cx - y, cy - x, 2 * y + 1, coul);
  159.     ligneHorizontale(cx - y, cy + x, 2 * y + 1, coul);
  160.     if (d < 0)
  161.       d = d + (4 * x) + 6;
  162.     else {
  163.       d = d + 4 * (x - y) + 10;
  164.       y--;
  165.     }
  166.     x++;
  167.   }
  168. }


 
graphique.h

Code :
  1. #ifndef GRAPHIQUE_H
  2. #define GRAPHIQUE_H
  3. /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
  4.   Données: Aucunes
  5.   Précondition: Avoir initialisé la SDL
  6. */
  7. void initCouleurs(SDL_Surface *ecran);
  8. /*Procédure: Affiche un pixel de couleur donnée
  9.   Données: Coordonées du pixel et code couleur
  10.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
  11.                 les coordonnées du pixel doivent se situer dans la fenêtre
  12. */
  13. void setPixel(int x, int y, Uint32 coul);
  14. /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
  15.   Données: Coordonées du pixel et code couleur
  16.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
  17. */
  18. void setPixelVerif(int x, int y, Uint32 coul);
  19. /*Procédure: Affiche une barre de dimensions données
  20.   Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
  21.   Préconditions: Avoir initialisé la SDL et le mode graphique
  22. */
  23. void barre(int x, int y, int w, int h, Uint32 coul);
  24. /*Procédure: Remplit la fenêtre en noir
  25.   Données: Aucunes
  26.   Préconditions: Avoir initialisé la SDL et le mode graphique
  27. */
  28. void effacerEcran(void);
  29. /*Procédure: Trace une ligne horizontale
  30.   Données: Coordonnées du point gauche, longueur de la ligne, code couleur
  31.   Préconditions: Avoir initialisé la SDL et le mode graphique
  32. */
  33. void ligneHorizontale(int x, int y, int w, Uint32 coul);
  34. /*Procédure: Trace une ligne verticale
  35.   Données: Coordonnées du point haut, hauteur de la ligne, code couleur
  36.   Préconditions: Avoir initialisé la SDL et le mode graphique
  37. */
  38. void ligneVerticale(int x, int y, int h, Uint32 coul);
  39. /*Procédure: Trace un rectangle
  40.   Données: Coordonnées du point supérieur gauche, largeur, hauteur
  41.   Préconditions: Avoir initialisé la SDL et le mode graphique
  42. */
  43. void rectangle(int x, int y, int w, int h, Uint32 coul);
  44. /*Procédure: Trace un cercle
  45.   Données: Coordonnées du centre, rayon et code couleur
  46.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
  47. */
  48. void cercle(int cx, int cy, int rayon, int coul);
  49. /*Procédure: Trace un disque
  50.   Données: Coordonnées du centre, rayon et code couleur
  51.   Préconditions: Avoir initialisé la SDL et le mode graphique  
  52. */
  53. void disque(int cx, int cy, int rayon, int coul);
  54. #endif


 
main.c

Code :
  1. #include <stdio.h>
  2. #include <SDL/SDL.h>
  3. #include "graphique.h"
  4. #include <stdlib.h>
  5. Uint32 couleurs[NB_COULEURS];
  6. void pause()
  7. {
  8.     int continuer = 1;
  9.     SDL_Event event;
  10.     while (continuer)
  11.     {
  12.         SDL_WaitEvent(&event);
  13.         switch(event.type)
  14.         {
  15.             case SDL_QUIT:
  16.                 continuer = 0;
  17.         }
  18.     }
  19. }
  20. int main(void)
  21. {
  22.   SDL_Surface *ecran=NULL;
  23.   if(SDL_Init(SDL_INIT_VIDEO)==-1){
  24.     fprintf(stderr, "Erreur à l'initialisation de la SDL: %s \n", SDL_GetError());
  25.     exit(EXIT_FAILURE);
  26.   }
  27.  
  28.   ecran=SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
  29.   if(ecran==NULL){
  30.     fprintf(stderr, "Erreur à l'initilisation du mode graphique: %s\n", SDL_GetError());
  31.     exit(EXIT_FAILURE);
  32.   }
  33.   SDL_WM_SetCaption("Collision de particules", NULL);
  34.   initCouleurs(ecran);
  35.   barre(10,10,100,10, couleurs[C_BLEU]);
  36.   pause();
  37.   SDL_Quit();
  38.  
  39.   return EXIT_SUCCESS;
  40. }


 
Mon problème c'est que si je veux utiliser une fonction de grahpique.c, comme j'ai voulu le faire à la ligne 42 de main.c "barre(10,10,100,10, couleurs[C_BLEU]);"
Ben le compilo va me dire qu'il ne connait pas couleurs et C_BEU, et je vois pas comment je peux contourner ce problème...
 
 
Merci de votre aide.

Reply

Marsh Posté le 26-11-2008 à 09:46:01   

Reply

Marsh Posté le 26-11-2008 à 09:58:12    

Ton énumération des couleurs, et ton tableau couleurs, doivent être déclarés dans graphique.h, pas dans graphique.c
 
Ou tu met un extern devant Uint32 couleurs[NB_COULEURS]; de main.c mais ça ne résout pas l'innaccessibilité de l'énumération des couleurs.


Message édité par kao98 le 26-11-2008 à 09:59:57

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 26-11-2008 à 10:13:12    

Ah d'accord je ne savais pas que ça se faisait de mettre les varialbes globales etc dans le .h mais ça résout bien des problèmes.
 
Donc j'ai modifié ainsi:
graphique.c:

Code :
  1. #include <SDL/SDL.h>
  2. #include "graphique.h"
  3. /*nom du pointeur (de type SDL_Surface) qui va stocker la surface qui correspond à toute la fenêtre,
  4.   utilisé dans quasiment toutes les fonctions de ce fichier. Il faudra donc pour utiliser la plupart  
  5.   des modules de ce fichier récupérer le pointeur renvoyé par SDL_SetVideoMode
  6. */
  7. #define POINTEUR_SURFACE ecran
  8. /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
  9.   Données: Aucunes
  10.   Précondition: Avoir initialisé la SDL
  11. */
  12. void initCouleurs(SDL_Surface *v_ecran)
  13. {
  14.   couleurs[C_NOIR]          = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x00);
  15.   couleurs[C_BLEU_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x80);
  16.   couleurs[C_VERT_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x00);
  17.   couleurs[C_CYAN_FONCE]    = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x80);
  18.   couleurs[C_ROUGE_FONCE]   = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x00);
  19.   couleurs[C_MAGENTA_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x80);
  20.   couleurs[C_OCRE]          = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x00);
  21.   couleurs[C_GRIS_CLAIR]    = SDL_MapRGB(v_ecran->format, 0xC0, 0xC0, 0xC0);
  22.   couleurs[C_GRIS]          = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x80);
  23.   couleurs[C_BLEU]          = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0xFF);
  24.   couleurs[C_VERT]          = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0x00);
  25.   couleurs[C_CYAN]          = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0xFF);
  26.   couleurs[C_ROUGE]         = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0x00);
  27.   couleurs[C_MAGENTA]       = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0xFF);
  28.   couleurs[C_JAUNE]         = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0x00);
  29.   couleurs[C_BLANC]         = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0xFF);
  30. }
  31. /*Procédure: Affiche un pixel de couleur donnée
  32.   Données: Coordonées du pixel et code couleur
  33.   Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
  34.                 les coordonnées du pixel doivent se situer dans la fenêtre
  35. */
  36. void setPixel(int x, int y, Uint32 coul)
  37. {
  38.   *((Uint32*)(POINTEUR_SURFACE->pixels) + x + y * POINTEUR_SURFACE->w) = coul;
  39. .
  40. .
  41. .


 
graphique.h

Code :
  1. #ifndef GRAPHIQUE_H
  2. #define GRAPHIQUE_H
  3. #define POITEUR_SURFACE ecran
  4. enum
  5. {
  6.   C_NOIR, C_BLEU_FONCE, C_VERT_FONCE, C_CYAN_FONCE, C_ROUGE_FONCE,
  7.   C_MAGENTA_FONCE, C_OCRE, C_GRIS_CLAIR, C_GRIS, C_BLEU, C_VERT,
  8.   C_CYAN, C_ROUGE, C_MAGENTA, C_JAUNE, C_BLANC,
  9.   NB_COULEURS
  10. };
  11. SDL_Surface* POINTEUR_SURFACE;
  12. Uint32 couleurs[NB_COULEURS]; /*tableau global servant à la fonction  InitCouleurs()*/
  13. /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
  14.   Données: Aucunes
  15.   Précondition: Avoir initialisé la SDL
  16. */
  17. void initCouleurs(SDL_Surface *ecran);
  18. .
  19. .
  20. .


Mais si je compile il va me dire que dans graphique.c "ecran" n'est pas déclaré, alors que j'ai bien inclut graphique.h  :??:

Reply

Marsh Posté le 26-11-2008 à 10:18:56    

C'est quoi exactement ce "#define POINTEUR_SURFACE ecran" ???


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 26-11-2008 à 10:20:59    

ben dans le main.c
Je fais "ecran=SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);"
 
Et donc si quelqu'un a envie de nommer la surface différemment que "ecran" ben il a juste à changer le define au lieu de changer tout les pointeurs un par un.

Reply

Marsh Posté le 26-11-2008 à 10:52:06    

Ha ouais mais nan !
Tu devrais revoir les notions de compilation et de pré-compilation, toussa.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 26-11-2008 à 10:57:58    

Ben y a le préprocesseur il va me changer mon define en "ecran" puis me mettre graphique.h dans graphique.c et main.c donc la variable ecran va bien être définit dans graphique.c et main.c, donc il va compiler ces deux fichiers puis va les linkers et hop.
Nan ?

Reply

Marsh Posté le 26-11-2008 à 11:00:36    

Non. Le préprocesseur, il va arriver à rien car à ce moment là, "ecran" n'est rien !
 
Edit : #define, c'est pas pour déclarer des variables !!!


Message édité par kao98 le 26-11-2008 à 11:02:14

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 26-11-2008 à 11:05:19    

Euh je comprend pas.  
#define est bien censé transformer toutes les occurences de "POINTEUR_SURFACE" en "ecran" ?
 
Edit: j'ai oublié un N à "POINTEUR_SURFACE"  
Maintenant ça compile mais j'ai une erreur de segmentation à l'éxecution


Message édité par Cpowa le 26-11-2008 à 11:11:43
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed