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 :
Et je cherche à écrire cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; };
les variables "type" et "params" sont créé et passé à l'objet event via son constructeur comme suis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
Les std::cout me donne ça sur ma sortie standard :
Voila, donc la ptite chançon habituelle : "Pourquoi ça marche paaaaaaaaas? Qu'est-ce que j'ai mal faaaaaais?"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é
Partager