Bonjour,
Je réalise actuellement le portage d'un jeu vidéo que j'avais programmé en Ruby, vers C# et Xna.
La version Ruby possède un mécanisme qui permet de charger du code depuis un fichier, et d'en faire un éval à l'intérieur d'une méthode d'une instance (où ce code a accès au variables d'instances de l'objet etc...).
Problème
Le problème c'est que ce n'est apparemment pas possible (ou alors très compliqué) à faire en C#.
Ce qu'il faudrait faire, en résumé, c'est exécuter du code, propre à une seule instance d'un objet, à l'intérieur de cette instance (donc ayant accès à toutes ces variables).
Pistes
J'ai fait de longues recherches sur le net afin d'essayer de trouver une solution. Voici ce que j'ai exploré (et qui n'a pas marché) :
- C# parser : Le nom pourrait faire penser que c'est une solution, mais je n'ai trouvé aucune documentation ou explication le concernant. J'ai tout de même téléchargé et compilé les sources, mais je ne vois pas du tout comment on l'utilise.
- Cet article, où il est fait question de compiler du code pendant l'exécution. Seul problème, on parle de compilation d'assemblys entiers...
Y'a-t-il donc une solution à mon problème ?
Merci de votre aide !
Solutions
Dans le but d'aider ceux qui auraient le même problème quoi moi, voici les solutions qui ont été données :
- Utiliser le langage de script LUA.
Un tutoriel ici : http://www.gulix.fr/blog/IMG/pdf/Lua.pdf
- faire comme cela (pour mon cas) :
Compile-time :
- Ecriture des comportements des events d'un niveau dans un fichier.
Chaque comportement sera caractérisé par un ID, identique à celui de l'Event correspondant.
- Compilation des comportements :
Assembly : path.du.niveau
Comportements stockés dans des méthodes statiques de la classe correspondant à path du niveau (à moins qu'on puisse faire une même classe notée partial, mais je sais pas si ça fonctionne si on compile pas tout en un assembly), dans le namespace qui sera le même que celui des Events
Run-time :
- Premier chargement du niveau : chargement de l'assembly qui porte le nom du path du niveau (avec les slashs remplacés par des ".").
- Initialisation de chaque Event : création des delegates de comportements (Delegates déclarés non statiques, et initialisés lors du chargement de données d'un event (et non pas forcément lors de la création de l'instance) => pas besoin de les stocker dans un dictionnaire à la limite, surtout que chacun est unique).
- Quand nécessaire : exécution des delegates avec pour argument l'Event en question.
Et ici un petit bout de code assez utile, provenant de DonQuiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // Signature que devront avoir les méthodes delegate void Behaviour(IActor actor, IActorState state); // Code pour charger la méthode comportementale "rock014" au début du niveau Assembly asm = Assembly.LoadFrom(".\\customscripts.dll"); Type type = asm.GetType("Scripting.CustomScripts"); MethodInfo method = type.GetMethod("rock014", BindingFlags.Public | BindingFlags.Static); Behaviour behaviour = (Behaviour)Delegate.CreateDelegate(method, null, typeof(Behaviour)); // On la stocke dans le dictionnaire des comportements behvioursDictionary["rock014"] = behaviour; // On pourrait appeler behaviour ainsi : behaviour(someActor, someActorState);








Répondre avec citation




Partager