Bonjour à tous et à toutes;
j'ai un soucis concernant la reflexion, mais je vais d'abord m'expliquer :
Dans le projet que j'effectue, je suis en train de mettre en place un système "WPF-like" sous XNA (mais on peut utiliser ce principe pour les Winforms), c'est à dire que j'aimerais que la création d'interface passe par un fichier XML et non plus par des centaines de lignes de code.
J'ai créer une bibliothèque pour le projet (nommé NeptuneEngine) dans laquelle est présente le GUI (button, checkbox, radiobutton pour le moment). Or si dans un de vos projets de jeux (nommons le QuackShot) vous voudriez utiliser le GUI, vous feriez ceci :
namespace QuackShot
{
public class Game1 : Core
{
Button btn;
// code
public override void LoadContent()
{
btn = new Button(this);
btn.Load("Content/Gui/Buttons/Aqua");
btn.Position = new Vector2(200, 100);
btn.Size = new Vector2(100, 25);
btn.Name = "Button1";
btn.Click += ClickEvent;
}
private void ClickEvent(Button Sender)
{
if(sender.Name.Equals("Button1"))
// Effectue l'action que l'on veut
}
}
}
Jusque là, je suppose rien de très compliqué...
Maintenant c'est là que le problème se pose :
si mon bouton est défini dans le fichier XML comme ceci :
<Button Name="Bouton1" Width="100" Height="25" Skin="Content/Gui/Buttons/Aqua" Position="200 100" Event="ClickEvent" />
Et bien dans ma bibliothèque j'ai un procédé me permettant de générer ce bouton :
private Button CreateButton(GuiSettings Settings)
{
Button btn = new Button(m_core);
btn.Load(Settings.Skin)
btn.Size = new Vector2(Settings.Width, Settings.Height);
btn.Position = Settings.Position;
btn.ClickEvent += ??????
return btn;
}
Comme ça dans votre jeu, le procédé devient :
InterfaceCreator Interface = new InterfaceCreator(this);
Interface.Load("Content/Interfaces/MenuScreen");
Methode Update : Interface.Update(gameTime);
Methode Draw : Interface.Draw(gameTime);
Ainsi on gagnerait en simplicité et productivité...
Maintenant c'est là question que je pose, comment générer l'event ClickEvent ?
J'ai bien essayé cette technique :
Type
Type = m_core.GetType(); // Apparement récupère la classe de jeu ("QuackShot.Game1")
MethodInfo
Info = Type.GetMethod(Settings.Event);
btn.ClickEvent +=
delegate(Button sender)
{
Info.Invoke(m_core, new object[] { sender });
};
Mais ça ne fonctionne pas. Le prgm plante toujours en me disant que l'objet ne correspond pas au type cible...
Alors j'ai changé m_core par btn, this, et tout un tas d'autres choses, mais rien ne fonctionne....
Je ne sais pas non plus comment récupérer le type cible...
Est-ce que quelq'un aurait une idée, parce que là je sèche....
Je suppose que la reflexion me permet de faire ce système WPF-like puisque WPF y arrive et doit utiliser un procédé similaire...
Merci des réponses que vous pourriez apporter....