Je suis d'accord avec rnr72 sur le coup de la taille du SDL_Rect utilisé pour SDL_BlitSurface
Je suis d'accord avec rnr72 sur le coup de la taille du SDL_Rect utilisé pour SDL_BlitSurface
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Non la largeur et hauteur de destination sont inutiles. Le rectangle destination n'est utilisé que pour la position, c'est la surface définie par la source qui est blittée à chaque fois, sans distorsion.
Sinon, on va commencer par une chose à la fois avant de faire de la gestion de ressources et compagnie hein.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Exact, tu as raison Bousk :
The width and height in srcrect determine the size of the copied rectangle. Only the position is used in the dstrect (the width and height are ignored).
autant pour moi, fausse piste...
justement, srcrct est null dans son appel. Ca risque de poser un léger soucis, ca, non?
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Normalement non :
If srcrect is NULL, the entire surface is copied. If dstrect is NULL, then the destination position (upper left corner) is (0, 0).
https://wiki.libsdl.org/SDL_BlitSurface
la source null c'est pour indiquer qu'on copie la surface entièrement et non qu'une partie définie par ce rect
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
J'avais mit en commentaire pourquoi le NULL dans la source
Est-ce qu'on pourrait se recentrer sur le problème de base, c'est a dire l'affichage de l'icone (ou le non-affichage du coup) si ca ne vous dérange pas, et voir les ressources / mémoire après ?
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Comme pour l'instant, le non affichage pourrai bien venir de la mauvaise gestion, c'est une piste non négligeable.
Plus un code est correct, moins il peut avoir d'erreur.
On ne peut pas dire, pour l'instant, ce qui cause le non affichage des icones du vector.
Mon avis reste que c'est le contenu des variables membres du vector qui est mal géré.
Peux-tu faire en sorte d'afficher le contenu complet du vector lorsque tu affiches? Quitte à volontairement interrompre la boucle de dessin après la première itération.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
oui, je suis d'accord avec leternel,
dans ton cas, ce n'est pas très compliqué, ajoute un attribut sdl_surface* iconeSurface dans ta classe et écris une fonction load() dans laquelle tu initialises iconeSurface avec ton IMG_Load...
et tu ne feras qu'un appel du genre icone.load()...
vois-tu le truc?
Donc j'ai fait un espece de mélange de vos différents conseils.
Donc j'ai modifié le constructeur pour qu'il charge l'image:
Mais je me demande si on peut appeler une fonction membre dans le constructeur, ca me semble un peu bizarre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Icone::Icone(SDL_Surface* _affichage, int _x, int _y, std::string _pathIcone) :affichage(_affichage), x(_x), y(_y), pathIcone(_pathIcone) { iconeSurface=IMG_Load(getPathIcone()); }
Dans le doute je l'ai aussi testé en chargeant l'image comme ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 iconeSurface=IMG_Load(_pathIcone.c_str());
dans la fonction dessinIcone j'ai ajouté l'affichage du contenu du vector:
ce qui me donne comme resultat sur la console:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Icone::dessinIcone() { SDL_Rect positionIcone; positionIcone.x=getX(); positionIcone.y=getY(); SDL_BlitSurface(iconeSurface, NULL, (affichage), &positionIcone); std::cout << "iconeSurface: " << iconeSurface << " surface source: " << affichage << " x,y:" << x << "," << y << " pathIcone: " << pathIcone << std::endl; }
iconeSurface: 0 surface source: 0xec43a0 x,y:0,0 pathIcone: Kodi.png
iconeSurface: 0 surface source: 0xec43a0 x,y:20,20 pathIcone: Epiphany.png
ce qui m'a l'air pas si faux que ca, si ce n'est les valeurs d'iconeSurface, mais je sais pas trop ce que c'est censé afficher.
Je pense qu'a ce stade il est inutile de préciser que je n'ai toujours pas d'icone à l'écran ...
Fais voir ta classe complete, avec les classes dont elle hérite.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
coucou Kalemiro,
si pas de problème, tu peux appeler fonction membre dans le constructeur cela fonctionne après savoir si c'est bien ou pas...Mais je me demande si on peut appeler une fonction membre dans le constructeur, ca me semble un peu bizarre
Les données affichée sont en partie des pointeur donc ont un résultat du genre surface source: 0xec43a0 mais effectivement iconeSurface: 0 est un pointeur nul, il semblerai y avoir un problème avec le chargement de l'image.ce qui m'a l'air pas si faux que ca, si ce n'est les valeurs d'iconeSurface, mais je sais pas trop ce que c'est censé afficher.
Comme le dit leternel, il faudrait pouvoir voir le reste du code.
Et au passage d'où vient la fonction IMG_Load, car il ne semble pas que se soit dans la bibliothèque SDL?
SDL_image, je suppose...
Vérifie également l'emplacement de tes images (je sais c'est un truc con) car si tu utilise un IDE du style code::block l'emplacement d'execution n'est pas bin/debug mais l'emplacement de tes sources...
Un autre moyen de vérifier ce problème spécifique, c'est de tester avec un chemin absolu pour le fichier d'image.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Enfin nous y sommes, malgré toutes les fois où tu nous a dit "ça marche quand j'utilise pas de vector", le problème est pourtant clair : ton IMG_Load retourne NULL parce que l'image n'est pas trouvée ou dans un format non géré par SDL_Image.
Donc bon je sais pas trop dans quelles conditions ça marchait, mais commence par utiliser les mêmes path pour tester une nouvelle structure de code!
Bon heureusement il existe IMG_GetError, mais ce n'est plus vraiment du ressort du forum C++ mais de celui du forum 2D/3D/Jeux depuis le début. Parce que l'ensemble de ton problème, après tout, n'est guère plus qu'une absence de lecture de la documentation et l'utilisation de SDL_Image.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Oui IMG_Load viens de SDL_Image ca me permet d'utiliser autre chose que des .bmp
Je me suis fait avoir lors de mes premiers essais sur ca mais la elles sont bien dans le dossierVérifie également l'emplacement de tes images (je sais c'est un truc con)
(j'utilise pas d'IDE, juste un editeur de texte et gcc)
Donc la j'avais refait ma classe icone pour faire des test et essayer de voir pourquoi ca marchait pas donc celle la ne dépend d'aucune autre classe j'ai juste repris les données membres et fonction utiles des autres classes pour les mettre dans celle la, voici le code:
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
40
41
42
43
44
45
46
47
48 class Icone { private: SDL_Surface* iconeSurface; //Surface de l'image de l'icone std::string pathIcone; //Nom du fichier image SDL_Surface* affichage; //Surface source (l'écran) int x, y; //Coordonnées de positions public: Icone(SDL_Surface*, int, int, std::string); ~Icone(); inline const char* getPathIcone() const {return pathIcone.c_str();} //On récupère un char* pour l'utiliser avec IMG_Load inline const SDL_Surface* getAffichage() const {return affichage;} inline const int getX() const {return x;} inline const int getY() const {return y;} void dessinIcone(); }; Icone::Icone(SDL_Surface* _affichage, int _x, int _y, std::string _pathIcone) :affichage(_affichage), x(_x), y(_y), pathIcone(_pathIcone) { iconeSurface=IMG_Load(getPathIcone()); //On charge l'image lors de l'appel du constructeur } Icone::~Icone() {} void Icone::dessinIcone() { SDL_Rect positionIcone; //Rectangle pour positionner l'icone positionIcone.x=getX(); positionIcone.y=getY(); SDL_BlitSurface(iconeSurface, NULL, (affichage), &positionIcone); //Parametres: image de l'icone, NULL = on affiche la totalité de l'icone, l'écran, position de l'icone std::cout << "iconeSurface: " << iconeSurface << " surface source: " << affichage << " x,y:" << x << "," << y << " pathIcone: " << getPathIcone() << std::endl; }
Donc j'ai refait un bout de code basique tout simple ou je lit le fichier texte (qui comporte juste une ligne maintenant avec le nom de l'image) et je l'affiche, ca marche, voici le code:
Manifestement l'image est trouvée, et le format est géré
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 int main() { init(); SDL_Surface* imageSurface; char* nomImage; std::ifstream fichier("application.txt"); std::string stringNomImage; if(fichier) { getline(fichier, stringNomImage); } nomImage = (char*)stringNomImage.c_str(); imageSurface = IMG_Load(nomImage); SDL_Rect positionImage; //Rectangle pour positionner l'icone positionImage.x=50; positionImage.y=50; SDL_BlitSurface(imageSurface, NULL, affichage, &positionImage); }
Dans ton code je ne vois pas l'initialisation de la variable affichage, je suppose qu'elle l'est par init() (non présentée) et donc que c'est une variable globale... c'est discutable.
Ta variable nomImage ne sert à rien, met ton .c_str() directement dans ton IMG_Load, comme le dit leternel
Comme le dit Bousk, il faut que tu trouves pourquoi IMG_Load te retourne un pointeur NULL, je pense que tout le problème vient de làUne variable de moins est une source d'erreur en moins.
Le principe de base, en C++, c'est que c'est la chose qui acquiert une ressource qui doit la libérer.
Ton constructeur appelle IMG_LOAD(), le destructeur devrait appeler la fonction symétrique (que je ne connais pas).
De même, le constructeur doit s'assurer d'avoir réussi l'acquisition.
Ces deux considérations sont l'essence de RAII.
Enfin, toute classe ne devrait RAIIer qu'une seule ressource, peut-être devrais-tu créer une classe dédiée à la récupération d'une image.
Au passage, c'est dommage de lier l'image à son affichage.
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
40
41 namespace raii { class sdl_image { private: SDL_Surface* surface; public: void blit_at(SDL_Surface* affichage, SDL_Rect * position) const { SDL_BlitSurface(surface, NULL, affichage, position); } sdl_image(std::string const& path): surface(IMG_Load(path)){ if (!surface) { throw std::runtime_error(IMG_GetError()); } } ~sdl_image() { SDL_FreeSurface(surface); } }; } class Icone { private: raii::sdl_image image; std::string pathIcone; //Nom du fichier image SDL_Surface* affichage; //Surface source (l'écran) SDL_Rect position; public: Icone(SDL_Surface* affichage, int x, int y, std::string const& path): pathIcone(path.c_str()), affichage(affichage), position{x, y, 0, 0}; {} SDL_Surface const* getAffichage() const {return affichage;} int getX() const {return position.x;} int getY() const {return position.y;} void dessinIcone() {image.blit_at(affichage, &position);} };
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Je suis entièrement d'accord avec leternel, on en revient à ce que nous te disions hier : la gestion des ressources.
Dans tout les cas, tu finiras par y passer donc fait le dès maintenant
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager