So che questa domanda è stata posta più volte, ma non sono ancora sicuro di come implementare la gestione degli input in un motore basato su componenti.
Il design basato sui componenti che ho usato era basato sulla serie di blog di T = Machine e su Artemis in cui le Entità sono solo ID.
Ci sono tre idee principali che ho nell'implementazione della gestione degli input:
- Il componente di input conterrà eventi di suo interesse. Il sistema di input tradurrà gli eventi chiave e del mouse in eventi di gioco e passerà in rassegna le entità con il componente di input e se sono interessati all'evento verrà intrapresa un'azione appropriata dal sistema di input. Questa azione verrebbe codificata sul sistema di input.
- Nessun componente di input. Registrereste entità con eventi specifici nel sistema di input. Il sistema di input invierebbe quindi messaggi (con ID entità e tipo di evento) ad altri sistemi in modo che questi possano intraprendere le azioni appropriate. O come nel primo caso, le azioni sarebbero codificate nel sistema di input.
- Simile al primo metodo, ma invece di codificare a fondo l'azione sul sistema di input, il componente conterrebbe una mappa di eventi per funzioni (cioè
std::map<std::function>
) che verrebbero chiamati dal sistema di input. Ciò ha l'effetto aggiuntivo di poter accoppiare lo stesso evento ad azioni diverse.
Consiglieresti uno dei metodi sopra indicati o hai qualche suggerimento che mi aiuterebbe a implementare un sistema di gestione dell'input flessibile? Inoltre, non ho ancora familiarità con il multi-threading, ma qualsiasi suggerimento che renderebbe l'implementazione intuitiva per i thread è il benvenuto.
Nota: un ulteriore requisito che mi piacerebbe che l'implementazione soddisfacesse è che sarei in grado di trasmettere lo stesso input a molte entità, come ad esempio spostare un'entità videocamera e il giocatore contemporaneamente.