IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

SDL Surface extern


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut SDL Surface extern
    Bonjour,

    J'ai un problème dans une fonction. A chaque fois que je ferme le programme, j'ai une erreur Windows a générer des erreurs....
    C'est du à cette ligne dans le code
    surfaceBouton = load_image(temp);

    Le but de cette fonction est de délimier les sprites sur une image entière.
    A chaque fois que l'on rencontre un sprite "Rouge", alors celà signifie que c'est la fin du sprite (idem pour la position verticale).

    J'ai déclaré toutes mes surfaces dans un fichier.h qui contient uniquement les variables globales.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface * surfaceBouton;
    Ensuite dans un autre fichier cpp. Je rappele cette variable avec un extern sinon le compilateur me sort multiple déclaration of this variable..
    extern SDL_Surface * surfaceBouton;

    voici le code de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    bool Charger_Bouton()
    {	
    	// 1 - On charge l'image dans la mémoire
    	char temp[100];
    	GetPrivateProfileString("BOUTON","Fichier","",temp,100,".\\Data.ini" );
    	surfaceBouton = load_image(temp);
    	if(surfaceBouton == NULL) return false;
     
    	// 2 - On écrit les coordonnées des différents des bouton dans des SDL_Rect
    	int y,tx,ty;
    	y = 0;
     
    	for(int i = 0 ; i < NB_STYLE_BOUTON +1 ; i++)
    	{
    		//Réinitialisation des valeurs
    		tx = 1;
    		ty = 1;
     
    		//Coordonnées du début du sprite
    		clipBouton[ i ].x = 0;
    		clipBouton[ i ].y = y;
     
    		//On recherche le pixel délimiteur afin de déterminer la taille du sprite
    		while(!GetPixelColor(surfaceBouton, tx, y) && tx < surfaceBouton->w)
    		tx++;
     
    		while(!GetPixelColor(surfaceBouton, tx, ty + y) && (ty + y )< surfaceBouton->h)
    		ty++;
     
    		//Taille du sprite
    		//clipBouton[ i ].w = tx;
    		clipBouton[ i ].h = ty;
     
    		y = y + ty + 1 ; //On se positionne sur le pixel suivant le pixel délimiteur
    	}
     
    	return true;
    }
    Sûrement du au même pb, si je décommente cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //clipBouton[ i ].w = tx;
    le prog se ferme tout seul.

    Je vous remercie d'avance pour votre aide.

    Peruvio

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    dans ta boucle for il y a :
    c'est normal le +1 ?

    comment est déclaré clipBouton ?

    tes boucles while pour déteriner tx et ty sont malsaines
    tx peut prendre une valeur supérieure à surfaceBouton->w
    et ty peut dépasser surfaceBouton->h
    regardes de ce coté là aussi

    je ne comprend pas ton histoire de
    A chaque fois que l'on rencontre un sprite "Rouge", alors celà signifie que c'est la fin du sprite
    je pense que tu veux parler de pixel rouge ?

    mais si tes sprites sont carrés, ton while pour ty ne fonctionne pas puisque indique déjà un pixel rouge
    tu pourrais montrer à quoi ressemble un sprite ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut
    Pour NB_STYLE_BOUTON +1, j'avais commencé ma numération a partir de 0 donc celà était normal.

    clipBouton était déclaré de la même manière que mes autres ressources globales.
    cad dans mon cpp : extern SDL_Rect clipBouton[ NB_STYLE_BOUTON ];

    Pensant que mon anomalie venait des déclarations, j'ai un peu tout chamboulé pour ne plus avoir de variables globales. Tout est défini dans les classes maintenant.
    Et donc j'ai trouvé que c'est en fait la ligne ci-dessous qui fait planter le programme à sa sortie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    surfaceBouton = load_image(temp);
    J'ai essayé plusieurs types d'images, ça fait tout le temps la même chose.

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    Citation Envoyé par peruvio Voir le message
    Pour NB_STYLE_BOUTON +1, j'avais commencé ma numération a partir de 0 donc celà était normal.
    bah justement non ce n'est pas normal

    avec une déclaration comme celle-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern SDL_Rect clipBouton[ NB_STYLE_BOUTON ];
    tes données sont stockées de 0 à NB_STYLE_BOUTON -1 et non +
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 0 ; i < NB_STYLE_BOUTON ; i++)
    quand à load_image, c'est une fonction à toi ?
    auquel cas il faudrait voir le code pour savoir d'où vient le problème
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut
    load_image est une fonction prise dans l'un des tutoriels de ce site.

    Par contre, l'image est bien chargée et bien affichée, je comprend plus rien.
    Peut être est-ce une variable qui ne soit pas effacée lorsque je quitte le programme...

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Peruvio utilise plutot la STL et des conteneurs comme std::list ou std::array pour faire des instances de clipBouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Taille du sprite
    //clipBouton[ i ].w = tx;
    clipBouton[ i ].h = ty;
    Vérifier dans l'aide de SDL mais je ne crois pas qu'on puisse redimensionner ainsi une SDL_Surface
    Une SDL_Surface est initialisée en hauteur et largeur à la création
    Si tu veux la redimensionner il faut la détruire et la recréer
    Sous Windows les SDL_Surface ce sont des DirectDrawSurface en fait ( de Direct X) et il n'est pas possible de redimensionner une DDS après la création
    Je ne pense pas que tu puisses la redimensionner de cette manière parce qu'une "surface" c'est une zone de la mémoire de la carte graphique ; on dit à la carte graphique : alloue-moi tant d'octets selon w et h et la profondeur de pixel

    On peut faire une analogie avec malloc en fait : malloc alloue des octets en RAM et pour une SDL_Surface c'est dans la VRAM

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclarer SDL surface dans fonctions
    Par guillaume40 dans le forum SDL
    Réponses: 12
    Dernier message: 15/11/2010, 21h03
  2. [FAQ][SDL] Comment récupérer les pixels d'une surface ?
    Par Fiquet dans le forum Contribuez
    Réponses: 2
    Dernier message: 19/09/2010, 11h24
  3. Changement de la taille d'une surface SDL
    Par Kerwando dans le forum SDL
    Réponses: 4
    Dernier message: 06/06/2006, 21h34
  4. [SDL] Pointeurs de surfaces
    Par Sun3clipse dans le forum SDL
    Réponses: 4
    Dernier message: 27/05/2006, 18h10
  5. Probleme affichage SDL surface
    Par masterfrog dans le forum SDL
    Réponses: 4
    Dernier message: 27/11/2005, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo