A prioris, ma facon de traiter le truc a pas ete proposée. Voici donc comment je ferais de mon coté :

tout d'abord, un evenement c'est deux choses :
1/ une condition de decelchement.
2/ une action a effectuer lorsque cette condition est remplie.

Je mettrais donc en place une classe abstraite d'action. Mon moteur ne gere que ca, et mon jeu derivé du moteur peut a loisir faire ses actions en derivant de cette classe abstraite.

Donc, dans la classe action, pas grand chose, une fonction d'execution d'action tout au plus, qui doit etre virtuelle (on l'apelle "do"). Si une action specifique necesite des parametres, ils peuvent etre recuperés dans al fonction eecutée, ou bien passé en parametre a l'action via son constructeur par exemple.

Pour les declencheur, c'est plus complexe. La solution la plus souple et personnalisable qui me viens est la suivante :

Un gestionnaire de declencheurs, qui est un singleton, et qui contient des declencheurs. (pourquoi pas un std::vector ?)

Un declecheur est une classe abstraite, avec un fonction virtuelle qui renvoie un booleen (test), qui sert a tester si la condition est remplie, et un ensemble d'actions a declencher. Il devra aussi avoir une fonction membre qui sert au gestionnaire, qui teste si la condition est verifié via appel de la fonction test et qui declenche les actions.

On peut imaginer le declencheur comme une action, via heritage. La fameuse fonction membre su-citée serait alors la fonction do, ce qui permetrait de faire des declencheurs qui en declenchent d'autres, et du coup d'ecrire des conditions simples.

A chaque frame, le gestionnaire de declencheur lance un do sur tous les declencheur qui sont inscrit chez lui.

EDIT: une fonction virtuelle, ca n'est ni plus ni moins qu'un pointeur sur un fonction deguisé.