Suite aux demandes sur l’intégration de tableaux dans GD, j’ai commencé le développement d’une petite extension qui permettera de gérer des tableaux (à une dimension pour commencer, puis à deux).
Je la sors pas tout de suite car il y a pour le moment 1 action et 1 expression.
(L’extension n’utilise que la lib standard de C++ et la STL avec std::vector et std::map).
Je fais le maximum pour que son utilisation soit simplifiée, c’est-à-dire, pas besoin de déclarer le tableau ni sa taille, tout cela est fait à la volée.
Voilà un exemple d’événement :
[attachment=0]ExempleTableaux.png[/attachment]
Les deux 1ères actions donnent des valeurs au tableau “test”. Ce qui pourrait se traduire en C++ :
double test[2];
test[0] = 12;
test[1] = 15
L’action d’affichage utilise une expression de l’extension qui retourne la valeur contenue à un endroit d’un tableau :
Array::NumberAt(nomDuTableau, Index)
Enfin, la dernière action ajoute 1 à la valeur de l’index 1 du tableau “test”.
EDIT :
Array::Count(nomDuTableau)
permettera de connaître la taille du tableau, qui est en fait l’index défini le plus grand + 1 .
Par contre, les tableaux seront forcément dépendants de la scène en cours, et donc, il n’y aura pas de tableaux globaux.
Enfin, je pense, j’ai pas testé ça.
4ian : Est-ce que l’extension est réinitialisée à chaque lancement de scène ? Parce que j’ai un ArrayManager qui est une singleton.
Aussi, pour compiler l’extension pour Linux, comment je compile les libs ?
Non, comme l’extension est chargée une unique fois au lancement, il n’y a pas de raison que ton singleton soit remis à zéro.
Tu peux proposer une action pour remettre les tableaux à zéro.
Si ça te gène trop, tu peux aussi passer à une vision différente des choses en créant un objet “Tableau” qu’il faudra placer sur la scène ( ou créer dynamiquement avec l’action appropriée ) pour chaque tableau que l’on souhaite avoir.
Ah oui, il faut que je mette en place un SDK pour Linux.
Par contre, un truc qui est embêtant avec le singleton, plus que l’action de remise à zéro, c’est que les tableaux sont communs à tous les jeux ouverts avec GD.
Autant c’est pas génant pour une extension comme l’extension Réseau, qui a une classe singleton pour gérer les données envoyées/reçues, autant pour les tableaux, on s’attend plus à ce qu’ils soient limités au jeu.
Pour émuler des tableaux qui se restreignent au jeu voir à la scène, tu peux utiliser une std::map du style :
std::map<Scene*, Tableaux> tousLesTableaux
Ce que je veux dire, c’est que avec cette map, tu peux ranger tes tableaux par scène. ( Ou par jeux si tu fait une std::map<Game*, Tableaux )
Ensuite, quand tu utilise une action qui va modifier un tableau, il te suffit de passer à ta map le pointer vers la scène
bool ActionSurUnTableau( RuntimeScene & scene, ObjectsConcerned & objectsConcerned, const Instruction & action )
{
taMapGerantLesTableaux[&scene].EtLaTuPeuxAccederAuTableauxDeLasceneCommeAvant...
//Genre :
taMapGerantLesTableaux[&scene].clear(); //Pour effacer tous les tableaux de la scène si tu les gère avec un std::vector.
}
C’est cette solution que j’ai utilisé pour les fonctions par exemple, qui se limitent aux scènes. Regarde l’extension Function si tu souhaite, mettre en place une telle solution n’est pas très compliqué.
J’avais oublié un détail : les valeurs de ma singleton ne sont pas réinitialisées à chaque Aperçu dans GD.
A part demander à l’utilisateur de mettre une action au lancement de la scène, n’y a-t-il pas moyen de faire autrement ?
J’ai crée un petit exemple permettant de montrer les capacités de l’extension avec ici un tableau à une dimension numérique : Indisponible
(Il est conseillé de ne pas utiliser la fonction insérer (touche I) sur des index qui n’existe pas encore (qui ne sont pas affichés à l’écran), ça ne marche pas.).
Je poste ce message car :
j’ai téléchargé l’extension tableau 1.1 (stable)
J’utilise Game Develop 1.5.9980.50345
J’ai installé l’extension dans le dossier “extension” de GD.
mais à l’ouverture du logiciel, un message m’annonce un problème et que l’extension tableau n’a pas pu être chargée.
Victor, ou 4ian, pourriez-vous m’aider ?