[Aide] Ajouter des ressources dans le gam.edg

Bonjour,

J’ai vu qu’il fallait mettre :

supplementaryRuntimeFiles.push_back(std::pair<std::string, std::string>("Windows", "QtCore4.dll"));

(par exemple) pour copier des fichiers nécessaires à l’exécution du jeu.

  • Mais je voudrais savoir comment inclure des ressources dans le gam.edg, comme le fait l’objet Texte avec la police de caractère :confused:
  • Aussi, y a t’il moyen d’accéder aux images de la banque d’image du jeu sous une autre forme qu’une image SFML :confused: Si oui, comment et avec quelle sorte d’objet ?

Dans le fichier TextObject.cpp :

void TextObject::PrepareResourcesForMerging(ResourcesMergingHelper & resourcesMergingHelper) { fontName = resourcesMergingHelper.GetNewFilename(fontName); }

Cette fonction ( PrepareResourcesForMerging ) est déclarée dans Object.h et peut donc être redéfinie par les objets des extensions, comme l’objet Texte. Elle est appelée à la compilation.
La fonction utilise l’objet ResourcesMergingHelper. C’est une classe extrêmement simple qui collecte les noms des fichiers à copier dans gam.egd, et qui retourne gentiment en partie le nom du nouveau fichier.
Dans le cas de l’objet texte, l’objet signale qu’il souhaite un nouveau nom de fichier pour la police, que va lui donner resourcesMergingHelper, et ce dernier va retenir l’ancien nom de fichier pour le copier automatiquement lors de la compilation.

Déjà, tu peux éventuellement essayer d’utiliser une image SFML. Notamment via la fonction sf::Image::GetPixelsPtr qui retourne un tableau contenant tous les pixels de l’image. Je pense que Qt serait capable d’utiliser ce tableau dans une Qimage avec un truc du genre : QImage(lePointeurVersLeTableauDePixels, HauteurDeLimage, LargeurDeLimage, QImage::Format_ARGB32).
Seul problème, le format des images de SFML n’est pas ARGB32 mais RGBA32 ( En mémoire : Red, Green, Blue, Transparence pour chaque pixel et dans cet ordre). Il faudrait donc convertir en mettant la transparence avant la couleur, puis charger avec le constructeur de QImage que j’ai cité. Ca se fait, mais c’est un peu embetant de se taper le parcours du tableau de pixel et l’inversion de tout ça…

Sinon, RessourcesLoader propose aussi LoadBinaryFile qui permet de charger n’importe quel fichier ( soit depuis gam.egd, soit depuis l’extérieur si le fichier n’est pas trouvé dans gam.egd ), mais il faut là aussi se taper le chargement depuis la mémoire.
Bref, pas de solution simple, tu peux peut être tenter la première à savoir convertir une sf::Image en QImage…

Ok,
mais j’accède comment aux images de la banque d’images ? :confused:

C’est pas le noyau de GD qui gère ça? :astonished:

Chaque jeu entrain d’être joué ( classe RuntimeGame ) possède un lien ( pointeur ) vers le gestionnaire d’image ( ImageManager ), qui gère les images du jeu ( c’est à dire les images SFML et texture OpenGL ).
Depuis une action, tu peux par exemple faire ( Pour obtenir une sf::Image ) :
scene.game->imageManager->GetSFMLImage(“MonImage”);

Le gestionnaire d’image s’occupe de charger les images. Pour lui indiquer que tu souhaite conserver l’image, il faut cependant garder un pointeur intelligent vers l’image, comme ceci par exemple :

class MonObjet { boost::shared_ptr<sf::Image> monImageQueJeGardeAvecMoi; //Le pointeur intelligent sera détruit quand l'objet mourra, et l'image sera déchargée de la mémoire si elle n'est plus utilisée. }

Tu peux aussi la copier et la conserver toi même si tu le souhaite :

sf::Image monImageQueJeGereToutSeul = *scene.game->imageManager->GetSFMLImage("MonImage");

Qui gère quoi ?
L’accès aux images ? Si avec ImageManager comme je l’ai dit au dessus.
L’accès aux ressources du jeu ? Si, avec RessourcesLoader.

Au contraire, de ce coté là c’est plutôt bien pris en charge par le noyau, mais celui ci offre notamment des fonctionnalités optimisées pour une utilisation dans SFML/OpenGL ( en fournissant de quoi accéder facilement à une sf::Image ou une texture OpenGL ) mais il n’y a pas forcément de truc déjà fait pour ouvrir une QImage par exemple. ( Mais ce serait possible, il faudrait soit ouvrir l’image sous forme d’une sf::Image et la convertir, soit ouvrir directement le fichier sous forme binaire ( RessourcesLoader::LoadBinaryFile ) et utiliser ça pour créer la QImage. )

Je remonte un peu le sujet, mais pour utiliser ResourcesMergingHelper, il faut forcement que ça soit utiliser par un objet (car ton exemple vient de l’objet texte).
Parce qu’en fait, je voudrais que ça mettent les ressources utilisée par des actions dans le gam.edg, comme les actions pour jouer des sons.

UP

Actuellement, les actions du genre celles jouant du son ou affichant un texte avec une police ont le code pour copier leurs fichiers directement intégré en dur à la compilation.
Je vais intégrer un moyen pour généraliser ça aux extensions.

J’ai ajouté ça à la prochaine version :

void AudioExtension::PrepareActionsResourcesForMerging(Instruction & action, ResourcesMergingHelper & resourcesMergingHelper) { if ( action.GetType() == "PlaySound" || action.GetType() == "PlaySoundCanal" || action.GetType() == "PlayMusic" || action.GetType() == "PlayMusicCanal" ) action.SetParameter( 0, resourcesMergingHelper.GetNewFilename(action.GetParameter(0).GetPlainString())); }

C’est à dire une méthode PrepareActionsResourcesForMerging ( et PrepareConditionsResourcesForMerging ) que les extensions pourront redéfinir et qui sera appelée à la compilation ( ou à l’enregistrement/chargement des jeux en version portable ) pour inventorier et changer le nom des fichiers des ressources.

Ok, cool, donc ça changera le nom du fichier dans l’action directement ?

Oui, la méthode que j’ai mise met à jour le premier paramètre des actions voulues grâce à ResourcesMergingHelper ( Comme pour les objets ).

Basiquement, si tu as une action/condition qui utilise un fichier à intégrer, tu fais de même en adaptant le type de l’action et le paramètre.
( Au passage, il faut, quand tu testera le type de l’action, rajouter GetNameSpace() avant le type de l’action, comme ceci : action.GetType() == GetNameSpace()+“NomAction” car Game Develop préfixe les noms des actions/conditions/expressions par le nom de l’extension ).

(je prépare l’extension pour intégrer ça)
Par simple curiosité, a quoi ressemble nom du fichier après compilation ?
Est-ce comme un fichier normal avec un vrai path ? Ou doit-on l’ouvrir avec une classe appropriée ?

up

La même chose sans le répertoire pour le moment. Il n’y a pas de gestion des conflits de noms pour le moment ou de modification importantes du nom de fichier. ( Ça pourrait changer à l’avenir. )

Les fichiers sont rassemblés dans le fichier de jeu. Il peuvent être accédés avec RessourcesLoader en utilisant leur nom de fichier. Tu peux y accéder sous forme d’objet préparé pour toi, genre des images/sons SFML ou si tu souhaite en faire autre chose, tu peux alors demander leur pointeur ( LoadBinaryFile ) et leur taille ( GetBinaryFileSize ) ce qui permet alors de les ouvrir avec des fonctions de chargement depuis la mémoire qui sont souvent offertes par les bibliothèques, et qui prennent souvent un pointeur vers les données et la taille justement.

Ok,
j’ai toujours un peu de mal à charger l’image par la mémoire.
En fait, Qt ne prend que un pointeur vers un uchar* et pas vers un Uint8.

Je peux peut-être faire une double boucle pour passer sur chaques pixels avec GetPixel(), récupérer la couleur (4 Uint8) et créer un pixel sur une QImage ?