2017-05-28 2 views
0

Je wan't de savoir comment pourrais-je améliorer ma façon de gérer les événements SFML:SFML code d'événement parsing

J'ai une fonction appelée processEvents() qui a un interrupteur pour le type d'événements, j'ai aussi avoir une fonction pour chaque type (comme mousePressed, mouseReleased, keyPressed ...). Et mon problème est la taille de ces fonctions, car j'ai aussi une classe enum pour les états du jeu, donc dans chaque fonction il y a un switch pour cela et dans chaque cas je fais des choses différentes, le résultat est que mouseReleased par exemple est de 341 lignes.

Je veux savoir comment je pourrais mieux analyser les événements afin de réduire la taille des fonctions.

+0

Diviser en plusieurs petites fonctions? –

+0

Regardez dans [actions Thor] (http://www.bromeon.ch/libraries/thor/tutorials/v2.0/actions.html) –

+0

Merci, cela semble intéressant – sleiphir

Répondre

0

Vous pourriez avoir un std::vector<bool> down et utiliser pour indexer le code ou le bouton de la souris (donc un vecteur pour le clavier et un autre pour la souris). Puis, lorsque l'événement est reçu, vous faites simplement down[event.key.code] = true et lorsque l'événement libéré est reçu, vous le définissez sur false.

+0

Mieux utiliser 'std :: map' alors, Vous n'avez donc pas besoin de cartographier toutes les valeurs possibles, même si elles ne sont pas utilisées. – Mario

+0

@Mario 'std :: unordered_map' serait mieux pour ça, mais encore mieux, vu que la quantité de touches pressées simultanément est toujours faible (même si quelqu'un frappe son clavier, c'est probablement <30), un simple' std :: vector 'avec une recherche linéaire est préférable. – Aidiakapi

+0

Non, une carte std :: map est lente à accéder. Et std :: vector est une spécialisation de modèle, chaque valeur booléenne prend seulement un peu en mémoire alors c'est ok :) –

0

Vous voulez effectivement décentraliser le code de traitement. Activez divers composants pour enregistrer un gestionnaire pour un événement sur un objet 'sfml event-dispatcher'. Le seul travail de cet objet est d'appeler les gestionnaires correspondants (peuvent être représentés en utilisant une fonction std ::) lorsqu'un événement arrive, sans savoir exactement ce que fait ce gestionnaire.

+0

Merci, je ne sais pas comment std :: fonction fonctionne mais je peux apprendre :) – sleiphir