Wiem, że to pytanie zostało zadane kilka razy, ale nadal nie jestem pewien, jak zaimplementować obsługę danych wejściowych w silniku opartym na komponentach.
Projekt oparty na komponentach, którego użyłem, był oparty na serii blogów T = Machine i na Artemis, w których jednostki to tylko identyfikatory.
Istnieją trzy główne pomysły, które mam przy wdrażaniu obsługi danych wejściowych:
- Komponent wejściowy przechowuje zdarzenia, które są zainteresowane. System wejściowy przełoży zdarzenia kluczowe i myszy na zdarzenia gry i będzie przechodził przez jednostki z komponentem wejściowym, a jeśli są one zainteresowane zdarzeniem, system wejściowy podejmie odpowiednie działania. Ta akcja byłaby zakodowana na stałe w systemie wejściowym.
- Brak elementu wejściowego. Zarejestrowałbyś podmioty z określonymi zdarzeniami w systemie wejściowym. System wejściowy wysyła następnie wiadomości (z identyfikatorem encji i typem zdarzenia) do innych systemów, aby mogły one podjąć odpowiednie działanie. Lub jak w pierwszym przypadku, działania byłyby zakodowane na stałe w systemie wejściowym.
- Podobnie jak w pierwszej metodzie, ale zamiast na stałe kodować akcję do systemu wejściowego, komponent zawierałby mapę zdarzeń do funkcji (tj.
std::map<std::function>
), Które byłyby wywoływane przez system wejściowy. Daje to dodatkowy efekt polegający na powiązaniu tego samego zdarzenia z różnymi działaniami.
Czy poleciłbyś którąś z powyższych metod, czy masz jakieś sugestie, które pomogłyby mi wdrożyć elastyczny system obsługi danych wejściowych? Ponadto nie jestem jeszcze zaznajomiony z wielowątkowością, ale wszelkie sugestie, które uczynią implementację przyjazną dla wątków, są również mile widziane.
Uwaga: Jednym z dodatkowych wymagań, które chciałbym, aby implementacja była spełniona, jest to, że będę w stanie przekazać te same dane wejściowe do wielu jednostek, takich jak na przykład przeniesienie jednostki kamery i odtwarzacza w tym samym czasie.