Jestem całkiem nowy w koncepcji systemów encji, po przeczytaniu wielu rzeczy (najbardziej przydatne, ten świetny blog i ta odpowiedź ).
Chociaż mam mały problem ze zrozumieniem, jak coś tak prostego, jak możliwość manipulowania pozycją obiektu przez nieokreśloną liczbę źródeł.
To znaczy, mam swój byt, który ma element pozycji. Mam wtedy jakieś wydarzenie w grze, które każe temu bytowi przemieścić się na określoną odległość w określonym czasie.
Te zdarzenia mogą się zdarzyć w dowolnym momencie i będą miały różne wartości dla pozycji i czasu. W rezultacie zostaną one złożone razem.
W tradycyjnym rozwiązaniu OO miałbym jakąś MoveBy
klasę, która zawiera odległość / czas i tablicę tych w mojej klasie obiektów gry. Każdą klatkę, iterowałbym wszystkie MoveBy
i zastosowałem ją do pozycji. Jeśli a MoveBy
osiągnął swój czas zakończenia, usuń go z tablicy.
W przypadku systemu encji jestem trochę zdezorientowany, jak powinienem replikować tego rodzaju zachowanie.
Gdyby istniał tylko jeden z nich na raz, zamiast być w stanie je połączyć, byłoby to dość proste (tak mi się wydaje) i wyglądałoby mniej więcej tak:
PositionComponent
zawierający x, y
MoveByComponent
zawierający x, y, time
Entity
który ma zarówno a PositionComponent
i aMoveByComponent
MoveBySystem
który wyszukuje byt zawierający oba te składniki i dodaje wartość MoveByComponent
do PositionComponent
. Po time
osiągnięciu usuwa komponent z tego elementu.
Jestem trochę zdezorientowany co do tego, jak zrobiłbym to samo z wieloma ruchami.
Moje początkowe myśli są następujące:
PositionComponent
, MoveByComponent
tak samo jak powyżej
MoveByCollectionComponent
który zawiera tablicę MoveByComponent
s
MoveByCollectionSystem
który szuka bytu oznaczonego „a” PositionComponent
i „ MoveByCollectionComponent
iterującego” MoveByComponent
wewnątrz niego, stosującego / usuwającego w razie potrzeby.
Wydaje mi się, że jest to bardziej ogólny problem polegający na tym, że wiele z tego samego komponentu jest pożądany, a każdy z nich chce mieć odpowiedni system. Moje byty zawierają swoje komponenty w haszu typu komponentu -> komponent, więc ściśle mają tylko 1 komponent określonego typu na jednostkę.
Czy to właściwy sposób, aby na to patrzeć?
Czy jednostka powinna mieć zawsze tylko jeden składnik danego typu?
move x by 10 in 2 seconds
a move x by -10 in 2 seconds
istota stałaby idealnie nieruchomo?
MoveBy
funkcjonalność była tylko prędkością? Brzmi, jakbyś był na dobrej drodze. W przypadku drugiego pytania istnieje wiele różnych implementacji systemów encji / komponentów. Ten opisany w mojej odpowiedzi, do której linkowałeś, miałby tylko jeden element danego typu.