Se jouer des types avec les void*?
Hoy les gens!
Aller un ptit problème, ça faisait longtemps.
Je cherche à écrire une fonction "touche à tout" dans l'optique d'un jeu que je programme en c++.
J'ai créé une classe Event qui, à partir d'un enum et quelques paramètre, exécute une (ou plusieurs) fonctions des différentes classe de mon jeu.
Le hic bien sur, c'est qu'aucune classe n'a le même paramètre. Mon idée est donc d'utiliser le void* pour récupérer ces paramêtres. Je dirais même mieux : utiliser un vecteur de void*.
J'ai donc cette class :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Event
{
public:
enum EventType
{
BACKGROUND_SPEED
};
Event();
Event(EventType type, std::vector<void*> params);
void DoEvent();
static EventType GetEventFromName(std::string name);
private:
EventType type;
std::vector<void*> params;
}; |
Et je cherche à écrire cette fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
void Event::DoEvent()
{
switch(type)
{
case BACKGROUND_SPEED:
{
std::cout << "Event BACKGROUND_SPEED exécuté" << std::endl;
Background *b =(Background *)(params[0]);
float * ts = static_cast<float *>(params[1]);
float * a = static_cast<float *>(params[2]);
std::cout << "Targeted_speed = " << *ts << ", acceleration = " << *a << std::endl;
b->SetTargetedSpeed(*ts, *a);
}
break;
default:
break;
}
} |
les variables "type" et "params" sont créé et passé à l'objet event via son constructeur comme suis :
Code:
1 2 3 4 5
| std::vector<void*> params;
params.push_back(&background); // Pointeur vers une instance de Background
params.push_back(&targeted_speed); // Doit valoir 100.0
params.push_back(&acceleration); // Doit valoir 1000.0
Event evnt = Event(Event::GetEventFromName("background_speed"), params); |
Pour résumer : Je passe à mon Event un vecteur de void * qui sert à stocker les paramètres quelque soit leur type. Le premier élément du vecteur est un pointeur sur l'objet dont on va faire l'appel à la fonction désirée, les éléments suivant sont les différents paramètre pour la fonction.
Les std::cout me donne ça sur ma sortie standard :
Code:
1 2 3 4
|
Event BACKGROUND_SPEED exécuté
Targeted_speed = -1.07374e+008, acceleration = -1.07374e+008
Appel à Background::SetTargetedSpeed // Cette ligne montre que le b->SetTargetedSpeed est bien appelé, on note un changement lors de l'exécution du jeu, mais pas le changement souhaité |
Voila, donc la ptite chançon habituelle : "Pourquoi ça marche paaaaaaaaas? Qu'est-ce que j'ai mal faaaaaais?"