Cpowa | 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 :
- #include <SDL/SDL.h>
- #include "graphique.h"
- /*nom du pointeur (de type SDL_Surface) qui va stocker la surface qui correspond à toute la fenêtre,
- utilisé dans quasiment toutes les fonctions de ce fichier. Il faudra donc pour utiliser la plupart
- des modules de ce fichier récupérer le pointeur renvoyé par SDL_SetVideoMode
- */
- #define POINTEUR_SURFACE ecran
- SDL_Surface* POINTEUR_SURFACE;
- enum
- {
- C_NOIR, C_BLEU_FONCE, C_VERT_FONCE, C_CYAN_FONCE, C_ROUGE_FONCE,
- C_MAGENTA_FONCE, C_OCRE, C_GRIS_CLAIR, C_GRIS, C_BLEU, C_VERT,
- C_CYAN, C_ROUGE, C_MAGENTA, C_JAUNE, C_BLANC,
- NB_COULEURS
- };
- /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
- Données: Aucunes
- Précondition: Avoir initialisé la SDL
- */
- Uint32 couleurs[NB_COULEURS]; /*tableau global servant à la fonction */
- void initCouleurs(SDL_Surface *v_ecran)
- {
- couleurs[C_NOIR] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x00);
- couleurs[C_BLEU_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x80);
- couleurs[C_VERT_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x00);
- couleurs[C_CYAN_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x80);
- couleurs[C_ROUGE_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x00);
- couleurs[C_MAGENTA_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x80);
- couleurs[C_OCRE] = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x00);
- couleurs[C_GRIS_CLAIR] = SDL_MapRGB(v_ecran->format, 0xC0, 0xC0, 0xC0);
- couleurs[C_GRIS] = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x80);
- couleurs[C_BLEU] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0xFF);
- couleurs[C_VERT] = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0x00);
- couleurs[C_CYAN] = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0xFF);
- couleurs[C_ROUGE] = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0x00);
- couleurs[C_MAGENTA] = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0xFF);
- couleurs[C_JAUNE] = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0x00);
- couleurs[C_BLANC] = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0xFF);
- }
- /*Procédure: Affiche un pixel de couleur donnée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- les coordonnées du pixel doivent se situer dans la fenêtre
- */
- void setPixel(int x, int y, Uint32 coul)
- {
- *((Uint32*)(POINTEUR_SURFACE->pixels) + x + y * POINTEUR_SURFACE->w) = coul;
- }
- /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
- */
- void setPixelVerif(int x, int y, Uint32 coul)
- {
- if (x >= 0 && x < POINTEUR_SURFACE->w &&
- y >= 0 && y < POINTEUR_SURFACE->h)
- setPixel(x, y, coul);
- }
- /*Procédure: Affiche une barre de dimensions données
- Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void barre(int x, int y, int w, int h, Uint32 coul)
- {
- SDL_Rect r;
- r.x = x;
- r.y = y;
- r.w = w;
- r.h = h;
- SDL_FillRect(POINTEUR_SURFACE, &r, coul);
- }
- /*Procédure: Remplit la fenêtre en noir
- Données: Aucunes
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void effacerEcran(void)
- {
- SDL_FillRect(POINTEUR_SURFACE, NULL, couleurs[C_NOIR]);
- }
- /*Procédure: Trace une ligne horizontale
- Données: Coordonnées du point gauche, longueur de la ligne, code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void ligneHorizontale(int x, int y, int w, Uint32 coul)
- {
- SDL_Rect r;
- r.x = x;
- r.y = y;
- r.w = w;
- r.h = 1;
- SDL_FillRect(POINTEUR_SURFACE, &r, coul);
- }
- /*Procédure: Trace une ligne verticale
- Données: Coordonnées du point haut, hauteur de la ligne, code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void ligneVerticale(int x, int y, int h, Uint32 coul)
- {
- SDL_Rect r;
- r.x = x;
- r.y = y;
- r.w = 1;
- r.h = h;
- SDL_FillRect(POINTEUR_SURFACE, &r, coul);
- }
- /*Procédure: Trace un rectangle
- Données: Coordonnées du point supérieur gauche, largeur, hauteur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void rectangle(int x, int y, int w, int h, Uint32 coul)
- {
- ligneHorizontale(x, y, w, coul);
- ligneHorizontale(x, y + h - 1, w, coul);
- ligneVerticale(x, y + 1, h - 2, coul);
- ligneVerticale(x + w - 1, y + 1, h - 2, coul);
- }
- /*Procédure: Trace un cercle
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- */
- void cercle(int cx, int cy, int rayon, int coul)
- {
- int d, y, x;
- d = 3 - (2 * rayon);
- x = 0;
- y = rayon;
- while (y >= x) {
- setPixelVerif(cx + x, cy + y, coul);
- setPixelVerif(cx + y, cy + x, coul);
- setPixelVerif(cx - x, cy + y, coul);
- setPixelVerif(cx - y, cy + x, coul);
- setPixelVerif(cx + x, cy - y, coul);
- setPixelVerif(cx + y, cy - x, coul);
- setPixelVerif(cx - x, cy - y, coul);
- setPixelVerif(cx - y, cy - x, coul);
- if (d < 0)
- d = d + (4 * x) + 6;
- else {
- d = d + 4 * (x - y) + 10;
- y--;
- }
- x++;
- }
- }
- /*Procédure: Trace un disque
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void disque(int cx, int cy, int rayon, int coul)
- {
- int d, y, x;
- d = 3 - (2 * rayon);
- x = 0;
- y = rayon;
- while (y >= x) {
- ligneHorizontale(cx - x, cy - y, 2 * x + 1, coul);
- ligneHorizontale(cx - x, cy + y, 2 * x + 1, coul);
- ligneHorizontale(cx - y, cy - x, 2 * y + 1, coul);
- ligneHorizontale(cx - y, cy + x, 2 * y + 1, coul);
- if (d < 0)
- d = d + (4 * x) + 6;
- else {
- d = d + 4 * (x - y) + 10;
- y--;
- }
- x++;
- }
- }
|
graphique.h
Code :
- #ifndef GRAPHIQUE_H
- #define GRAPHIQUE_H
- /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
- Données: Aucunes
- Précondition: Avoir initialisé la SDL
- */
- void initCouleurs(SDL_Surface *ecran);
- /*Procédure: Affiche un pixel de couleur donnée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- les coordonnées du pixel doivent se situer dans la fenêtre
- */
- void setPixel(int x, int y, Uint32 coul);
- /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
- */
- void setPixelVerif(int x, int y, Uint32 coul);
- /*Procédure: Affiche une barre de dimensions données
- Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void barre(int x, int y, int w, int h, Uint32 coul);
- /*Procédure: Remplit la fenêtre en noir
- Données: Aucunes
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void effacerEcran(void);
- /*Procédure: Trace une ligne horizontale
- Données: Coordonnées du point gauche, longueur de la ligne, code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void ligneHorizontale(int x, int y, int w, Uint32 coul);
- /*Procédure: Trace une ligne verticale
- Données: Coordonnées du point haut, hauteur de la ligne, code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void ligneVerticale(int x, int y, int h, Uint32 coul);
- /*Procédure: Trace un rectangle
- Données: Coordonnées du point supérieur gauche, largeur, hauteur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void rectangle(int x, int y, int w, int h, Uint32 coul);
- /*Procédure: Trace un cercle
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- */
- void cercle(int cx, int cy, int rayon, int coul);
- /*Procédure: Trace un disque
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void disque(int cx, int cy, int rayon, int coul);
- #endif
|
main.c
Code :
- #include <stdio.h>
- #include <SDL/SDL.h>
- #include "graphique.h"
- #include <stdlib.h>
- Uint32 couleurs[NB_COULEURS];
- void pause()
- {
- int continuer = 1;
- SDL_Event event;
- while (continuer)
- {
- SDL_WaitEvent(&event);
- switch(event.type)
- {
- case SDL_QUIT:
- continuer = 0;
- }
- }
- }
- int main(void)
- {
- SDL_Surface *ecran=NULL;
- if(SDL_Init(SDL_INIT_VIDEO)==-1){
- fprintf(stderr, "Erreur à l'initialisation de la SDL: %s \n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
-
- ecran=SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
- if(ecran==NULL){
- fprintf(stderr, "Erreur à l'initilisation du mode graphique: %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- SDL_WM_SetCaption("Collision de particules", NULL);
- initCouleurs(ecran);
- barre(10,10,100,10, couleurs[C_BLEU]);
- pause();
- SDL_Quit();
-
- return EXIT_SUCCESS;
- }
|
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. |