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 :
Même si mon assemblement de if/else est vraiment sympathique, je vois déjà plusieurs problèmes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while(running) { Event event = getNextEvent(); if(event == KeyPressed && event.code == Key::Escape) { closeApp(); } }
- 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:
Avec une structure Binding qui associe tout les évènements qui doivent être réunis pour que le callback soit appelé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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*)); }
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 :
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 } }
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 !
Partager