Bonjour à tous,
Je programme en ce moment un petit jeu et j'ai un petit soucis qui me dépasse pas mal. Je dois faire quelque chose d'abstrait et vu que je vais peut-être devoir utiliser les template je préfère demander à la communauté si c'est la meilleure solution pour mon problème.
Et bien voilà, j'ai des classes enfants (machine, soldats, etc...) qui dérivent toute d'une classe abstraite "entitée". Ces classes enfants ont des fonctions pour faire des actions comme tirer, appliquer des effets, dégats etc...
Maintenant pour gérer le temps, sans rentrer dans les détails j'ai fais un début de classe (TimedAction) pour gérer quand une fonction doit intervenir selon un intervalle. Attention voici la question super précise :
J'aurai besoin d'un pointeur d'une méthode d'une classe enfant ( ex: soldat->tirer() ) pour pouvoir l'appeller AVEC un ou des paramètres ( ex: soldat->tirer(5, 15) ) donnés en paramètre lors de la création de la classe TimedAction. En gros cela ressemblerai à ce pseudo-code :
Pour résoudre ce problème j'ai pensé stoquer dans la classe TimedAction une variable pointeur de l' "Entité" (Entity*), mais alors la fonction tirer() ne fait pas partie de cette classe abstraite (Entity) et va donner une erreure si je ne me trompe ? Il faudrait aussi éviter les virtual puisque n'importe quels méthodes devra être spécifiée comme recharger() en paramètre à la création d'une instance TimedAction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Soldat* soldatA = new Soldat("Soldat"); // toutes les 1 secondes, appeler tirer() de la classe Soldat avec les paramètres 5, 15, etc... (par ex: 5=dégats ; 15=vitesse ;...) : TimedAction* timeSoldatATirer< Soldat > = new TimedAction(1, *soldatA->tirer(), 5, 15, ...); // Serait pareil que faire soldatA->tirer(5, 15, ...) : timeSoldatATirer->execute();
Dans ce cas il faut envoyer le type de classe (Soldat ici) directement pour appeller la méthode? j'ai pensé aux templates qui utilise le type de classe donné. Je n'ai jamais utilisé ceci donc je ne sais pas vraiment comment transformer TimedAction en template. De plus est-ce la meilleur solution, la plus lisible, propre ?
Ensuite comment faire pour envoyer un nombre N de paramètres à la fonction quand on fait le prototype de celle-ci ou pour l'appeler par TimedAction ? Je pensais simplifier en mettant tous les paramètres dans un vector mais c'est peut-être pas la meilleur solution non plus.
Merci d'avance !
EDIT: Pour le moment j'ai un pseudo-code qui ressemble à ça pour TimedAction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 template < typename T > class TimedAction { public: TimedAction(); ~TimedAction(); private: unsigned int actionRAInterval; T *actionObject; // Not necessary when the function pointer contains the object directly // unknow type of variable // Arguments to give with the function to cast bool (T::functionName)(functionParameter1, functionParameterN); // Prototype of the pointer on the function to cast unsigned int lastActionRACast; bool continueCastingAfter; };
Partager