Bonjour 4ian,
J’ai essayé de créer une instance de RessourcesLoader, mais le compilateur me dit que le constructeur est privé,
donc comment je fais pour accéder à RessourcesLoader, vu que ses méthodes ne sont pas statiques.
Bonjour 4ian,
J’ai essayé de créer une instance de RessourcesLoader, mais le compilateur me dit que le constructeur est privé,
donc comment je fais pour accéder à RessourcesLoader, vu que ses méthodes ne sont pas statiques.
Normal, c’est une classe “Singleton” : ( tfc.duke.free.fr/coding/singleton.html ). Il s’agit d’une classe qui n’est destinée qu’à être créée qu’une seule fois, pour que l’ensemble du programme utilise la même classe.
Pour y accéder, c’est très simple :
RessourcesLoader::getInstance()->LaFonctionVoulue()
OK, assez étrange comme sorte de classe, j’en vois pas trop l’intérêt, mettre toutes les méthodes en static aurait été plus logique, non ?
Euh, ou sinon, si je veux charger, par exemple, l’image “a.png” de la banque d’image avec RessourcesLoader::getInstance()->LoadBinaryFile()
Je mets seulement le nom de l’image en 1er paramètre ?
Oui mais non, car l’objet a aussi des variables membres ( Ici une seule, une référence vers l’objet depuis lequel charger les ressources si possibles ). Et le singleton permet de gérer l’initalisation/la destruction de celle ci par exemple. Je te traduis par exemple vite fait un passage de “Modern C++ Design” d’Andrei Alexandrescu :
Utiliser seulement des fonctions statiques aurait été envisageable ici certes pour RessourcesLoader, mais la solution du singleton permet de garder une certaine flexibilité, comme par exemple modifier le constructeur de la classe afin d’ouvrir automatiquement un fichier ( C’est absolument inutile mais c’est pour l’exemple ) ou si un jour la classe contient d’autres membres, permettre de gérer la construction et la destruction de ceux ci proprement.
Si tu veux une image, préfère éventuellement :
1-Utiliser l’imageManager du game. Il se chargera de te renvoyer un pointeur intelligent ( ça se manipule comme un pointeur normal, sauf qu’il se delete tout seul ) vers une sf::Image.
2-Utiliser LoadImage de RessourcesLoader. Il te renverra un pointeur brut ( un pointeur normal ) vers une sf::Image. A toi de la gérer.
Si tu veux utiliser LoadBinaryFile(), entre le nom du fichier en paramètre, pas le nom de l’image. Le ressourceLoader te renverra un pointeur vers une zone mémoire brute contenant le fichier, mais uniquement si celui ci est présent dans le fichier .egd. Sinon, il renvoi NULL. Si tu as besoin de la taille de la zone mémoire renvoyée, ce qui est probable, utilise GetBinaryFileSize(nomdufichiervoulu).
Fait attention, dans l’éditeur, il n’y aura aucun fichier contenant les ressources de chargé, donc l’appel à LoadBinaryFile te renverra systématiquement NULL. Préfère utiliser alors par exemple directement des actions de wxWidgets/Qt/SFML pour charger ton image, ou encore mieux, utilise les deux premières solutions ci dessus.
(j’utilise l’imageManager)
Bon, mise à part les couleur qui correspondent pas (à cause du format ARGB32 et RGBA32). Ca marche QUE si l’image existe pas → l’image “Image introuvable” s’affiche, mais si l’image existe rien est affiché dans la boîte de dialogue.
EDIT :
j’ai fait un manip’ consistant à enregistrer l’image SFML chargée dans l’action, Après avoir exécuter l’action dans GD, je vais voir l’image (l’image existait dans la banque d’image).
Elle est vide, ou plutôt elle fait 0 pixels sur 0 pixels.
Alors que quand l’image n’existe pas, l’image “image inconnue” est enregistrée.
Bizarre, pourrais tu montrer le bout de code qui charge l’image ?
voilà la fonction en entier :
[code]bool ActDialogAddPicture( RuntimeScene & scene, ObjectsConcerned & objectsConcerned, const Instruction & action )
{
if(QtDialogs_dialog != NULL)
{
std::string imageName = action.GetParameter(0).GetAsTextExpressionResult(scene, objectsConcerned);
sf::Image monImageLoad = *scene.game->imageManager->GetSFMLImage(imageName);
QImage *monImage = new QImage((uchar *) monImageLoad.GetPixelsPtr(), monImageLoad.GetWidth(), monImageLoad.GetHeight(), QImage::Format_ARGB32);
QPixmap *monPixmap = new QPixmap(monImageLoad.GetWidth(), monImageLoad.GetHeight());
*monPixmap = QPixmap::fromImage(*monImage);
QLabel *nouveau = new QLabel(QString("Test"));
nouveau->setPixmap(*monPixmap);
QtDialogs_dialog_layout->addWidget(nouveau);
nouveau->show();
}
return true;
}[/code]
QImage charge l’image depuis l’image SFML.
QPixmap est une class de Qt qui gère les images, mais en particulier pour l’affichage, alors que QImage gère plus le chargement / modification de l’image.
Tu as essayé de faire monImageLoad.SaveToFile afin de voir ce que ça donnait c’est ça ? Ou tu as utilisé Qt pour ça ?
Déjà, je vois une faille potentielle : Autant la récupération de l’image avec GetSFMLImage et sa copie dans monImageLoad semble ok, autant cette dernière est temporaire, et sera détruite à la fin de l’action. Or il semble que le constructeur que tu as utilisé pour QImage nécessite que le tableau de pixel reste en vie.
Pour contourner ça, tu peux peut être tenter de recréer une nouvelle QImage à partir de monImage. Normalement, cette nouvelle image ne devrait pas avoir ce problème.
Ok, j’ai bien utilisé la méthode SaveToFile(std::string filename) pour tester de sf::image, ce qui fait que c’est vraiment bizarre.
Car l’image “image inconnue” marche bien et s’affiche même dans la boîte de dialogue. Mais quand l’iage demandée existe réellement, ça ne marche pas.
Une question de logique : si je modifie les pixels de l’image SFML que je récupère au début, ça ne risque pas de le modifier dans la banque d’image ?
(je voudrais utiliser cela pour modifier l’image SFML et que les couleur soient dans le bon ordre, par exemple, décaler les composantes red green blue alpha, afin d’avoir une “fausse” image correcte pour Qt).
Si tu modifie les pixels de *scene.game->imageManager->GetSFMLImage(imageName) alors en effet tu va modifier l’image de la banque d’images.
Si tu modifie les pixels de sf::Image monImageLoad qui est une copie, ça n’affectera pas l’image de base.
Bizarre, bizarre, tu as placé ce test directement après la création de monImageLoad ?
Est ce que c’est mieux si tu fait :
scene.game->imageManager->GetSFMLImage(imageName)->SaveToFile("C:\TonImage.png");
Pour le test avec SaveToFile, j’avais deux instructions :
EDIT : j’ai testé, l’image ne s’enregistre pas, enfin si mais elle est vide. Je crois que c’est un problème au niveau de GDL (je vais regarder 3DBox qui doit utiliser les images de la banque).
Mais non, ça s’est pour créer des jeux POUR la Wii, mais pas sur la Wii
Ah oui désolé…