L'architecture d'un event/input manager
Bonjour,
Je travaille actuellement sur un projet de moteur de jeu (juste pour m'�clater, rien de s�rieux),
et je bloque sur la gestion des events et des entr�es utilisateur.
I| Event Manager
Pour l'instant, j'ai une boucle du style :
Code:
1 2 3 4 5 6 7
|
while(running) {
Event event = getNextEvent();
if(event == KeyPressed && event.code == Key::Escape) {
closeApp();
}
} |
M�me si mon assemblement de if/else est vraiment sympathique, je vois d�j� plusieurs probl�mes :
- mon code va vite �tre difficile � maintenir, surtout si je commence � relier une action � plusieurs �v�nements
- je suis oblig� d'inclure toutes les d�clarations de fonctions/m�thodes que je souhaite relier � un �v�nement
- il va �tre tr�s compliqu� de "rebind" les actions (ex: je veux passer d'un clavier QWERTY � AZERTY)
Du coup, j'avais pens� faire une classe EventManager du style:
Code:
1 2 3 4 5 6
|
class EventManager {
public:
notify(Event *event); //permet à n'importe qui de prévenir qu'un évènement est arrivé
getNotified(Binding *binding, void(*callback)(Binding*));
} |
Avec une structure Binding qui associe tout les �v�nements qui doivent �tre r�unis pour que le callback soit appel�.
Sauf que la aussi, j'ai plusieurs questions qui restent en suspens :
- Sachant que dans ma boucle de jeu, handleInput() et render() s'executent quand ils peuvent, mais que update() s'execute � intervale r�gulier, ne vaut il pas mieux que les callback soient appel�s � chaque update(), et que je leur passe le deltatime en argument ?
- Cette question rejoint un peu la pr�c�dente, mais ne vaudrait-il pas mieux que j'appelle handleInput() avant chacune des update(), pour �viter de faire trop de suppositions sur le d�placement du personnage?
II| Input Manager
Jusque l�, je ne parlais que d'�v�nements ponctuel, du type "une touche vient d'�tre press�e", ce qui est bien dans le cas
ou je souhaite, par exemple, que mon personnage lance un sort, mais si je veux que mon personnage se d�place,
j'utilise plut�t quelque chose comme :
Code:
1 2 3 4 5 6
|
while(running) {
if(Keyboard.isKeyPressed(Key::Z) {
actor.move(0.0f, 1.0f) //déplace actor sur l'axe +y
}
} |
Or la, je n'ai aucune id�e de comment g�rer �a correctement. Est-ce qu'il est pr�f�rable que j'impl�mente un InputManager
similaire � mon EventManager, mais qui, � chaque tour de boucle, v�rifie si les touches inscrites via getNotified(...) sont press�e ?
Devrais-je plut�t l'int�grer directement � mon EventManager ?
Voila, je pense que j'ai expos� la majorit� de mes questions,
Merci beaucoup � ceux qui ont pris le temps de me lire !