Différence entre AutomatismsSharedDatas et AutomatismsRun...

Salut 4ian,

Quelle est la différence entre ces deux classes ? En quoi leur rôle diffère ?
Je compte m’en servir afin de conserver des “path” en global (qui seraient utilisables par tous les objets). Que dois-je faire pour cela ?

Comment accéder à des données globale lors de l’édition (dans l’éditeur d’automatisme) ?
Comment y accéder pendant que le jeu fonctionne ?
Est-ce que le RuntimeSharedData est déjà créé lors de l’édition de la scène ou se crée-t-il lors du lancement de la scène en aperçu (ou en jeu) ?

Merci d’avance.

AutomatismsSharedDatas permet aux automatismes de partager des données, qui seront communes à tous les automatismes ayant le même nom d’une scène.
AutomatismsRuntimeSharedDatas permet la même chose mais durant le jeu.

A cet effet, AutomatismsRuntimeSharedDatas est créé grâce à la méthode CreateRuntimeSharedDatas de AutomatismsSharedDatas. ( voir plus bas )

Game Develop s’occupe de créer l’AutomatismsSharedDatas quand un automatisme d’un type est créé pour la première fois. La seule chose à faire est de déclarer ta classe à GD dans la déclaration de l’automatisme, en la lui passant en dernier paramètre.
Dans l’éditeur de ton automatisme, tu peux accéder à ces données partagées ainsi :

[code]
//Setup shared datas
if ( !scene || scene->automatismsInitialSharedDatas.find(automatism.GetName()) == scene->automatismsInitialSharedDatas.end())
{
wxLogError(_T(“Impossible d’accéder aux données partagées.”));
return;
}

sharedDatas = boost::dynamic_pointer_cast<ScenePhysicsDatas>(scene->automatismsInitialSharedDatas[automatism.GetName()]);

if ( sharedDatas == boost::shared_ptr<ScenePhysicsDatas>() )
{
    wxLogError(_T("Impossible d'accéder aux données partagées : Données de mauvais type"));
    return;
}[/code]

Ici, sharedDatas est declaré comme ceci :

boost::shared_ptr<ScenePhysicsDatas> sharedDatas;

Il faut bien sûr remplacer ScenePhysicsDatas par le nom de ta classe.

Pendant le jeu, c’est cette fois AutomatismsRuntimeSharedDatas qui est utilisé. Pour récupérer un accès à cette classe, tu peux procéder ainsi :

if ( runtimeScenesPhysicsDatas == boost::shared_ptr<RuntimeScenePhysicsDatas>() ) runtimeScenesPhysicsDatas = boost::static_pointer_cast<RuntimeScenePhysicsDatas>(scene.automatismsSharedDatas.find(name)->second);

( J’ai prévu une méthode pour la prochaine version pour rendre remplacer ce “scene.automatismsSharedDatas.find(name)->second” par un plus evident “scene.GetAutomatismSharedDatas(name)”. )

A noter que GD n’a donc pas créé magiquement cette classe : Il l’a créé en appelant la méthode CreateRuntimeSharedDatas de tous les AutomatismsSharedDatas de la scène.

Donc pour résumer :

-Déclare ta classe qui hérite de AutomatismsSharedDatas dans l’extension.
-Personnalise la méthode CreateRuntimeSharedDatas de celle ci pour créer ta classe qui hérite de AutomatismsRuntimeSharedDatas.
-Accéde durant l’édition à la première ou durant le jeu à la seconde avec les lignes de codes que j’ai mises ci dessus.

AutomatismsSharedDatas sera parfaite pour conserver ces path “globaux”, c’est vraiment là l’utilité de cette classe.
Ensuite, je pense qu’il faut que AutomatismsRuntimeSharedDatas contienne les mêmes données pour que l’automatisme puisse y accéder durant le jeu.

Le fait qu’il y ait une distinction entre AutomatismsSharedDatas et AutomatismsRuntimeSharedDatas vient de la même distinction qu’il y a entre Scene et RuntimeScene : La première est faite pour enregistrer les données “initiales”, la seconde est ce qui est véritablement utilisé dans le jeu.
( Et de même que GD initalise les RuntimeScene depuis les Scene, on va créer les AutomatismsRuntimeSharedDatas depuis les AutomatismsSharedDatas ).

Merci pour cette explication détaillée. :slight_smile:
Il va falloir que j’adapte un peu le code actuel de l’automatisme chemin.