Po zadaniu dwóch pytań na temat systemów bytów ( 1 , 2 ) i przeczytaniu kilku artykułów na ich temat, myślę, że rozumiem je znacznie lepiej niż wcześniej. Nadal mam pewne wątpliwości, głównie dotyczące budowy emitera cząstek, systemu wejściowego i kamery. Oczywiście nadal mam pewne problemy ze zrozumieniem systemów encji i mogą one dotyczyć całej innej gamy obiektów, ale wybrałem te trzy, ponieważ są to bardzo różne koncepcje, powinny obejmować dość szeroki obszar i pomóc mi zrozumieć systemy encji i jak radzę sobie z takimi problemami, jak się pojawiają.
Buduję silnik w JavaScript i zaimplementowałem większość podstawowych funkcji, w tym: obsługę danych wejściowych, elastyczny system animacji, emiter cząstek, klasy i funkcje matematyczne, obsługę scen, kamerę i rendering oraz całą masę innych rzeczy, które zazwyczaj obsługują silniki. Przeczytałem odpowiedź Byte56, która zainteresowała mnie przekształceniem silnika w system encji. Nadal pozostałby silnikiem gry HTML5, z podstawową filozofią scen, ale powinien wspierać dynamiczne tworzenie bytów z komponentów.
Problem, który mam teraz, polega na dopasowaniu mojej starej koncepcji silnika do tego nowego paradygmatu programowania. Oto niektóre definicje z poprzednich pytań, zaktualizowane:
Podmiot jest identyfikatorem. Nie ma żadnych danych, to nie jest obiekt, to prosty identyfikator reprezentujący indeks na liście scen wszystkich bytów (które faktycznie planuję zaimplementować jako macierz komponentów).
Komponent jest posiadaczem danych, ale z metodami, które mogą pracować na tych danych. Najlepszym przykładem jest
Vector2D
komponent „Pozycja”. Ma dane:x
ay
, ale także niektóre metody, które sprawiają, że działające na danych nieco łatwiejszej:add()
,normalize()
, i tak dalej.System jest czymś, co może działać na zestawie podmiotów, które spełniają określone wymagania; zwykle jednostki muszą mieć określony zestaw komponentów, aby móc nimi operować. System jest częścią „logiczną”, „algorytmową”, a wszystkie funkcje dostarczane przez komponenty służą wyłącznie do łatwiejszego zarządzania danymi.
Aparat fotograficzny
Kamera ma Vector2D
właściwość położenia, właściwość obrotu i niektóre metody centrowania jej wokół punktu. Każda klatka jest podawana do renderera wraz ze sceną, a wszystkie obiekty są tłumaczone zgodnie z jego pozycją. Scena jest następnie renderowana.
Jak mogę reprezentować tego rodzaju obiekt w systemie encji? Czy kamera byłaby bytem, komponentem lub kombinacją (zgodnie z moją odpowiedzią )?
Emiter cząstek
Problemem, jaki mam z moim emiterem cząstek, jest to, co powinno być. Jestem prawie pewien, że same cząstki nie powinny być bytami, ponieważ chcę wesprzeć ich ponad 10 000, i wierzę, że stworzenie tak wielu bytów byłoby dużym ciosem dla mojej wydajności.
Jak mogę reprezentować tego rodzaju obiekt w systemie encji?
Menedżer wprowadzania
Ostatnim, o którym chcę porozmawiać, jest sposób obsługi danych wejściowych. W mojej obecnej wersji silnika istnieje klasa o nazwie Input
. Jest to moduł obsługi, który subskrybuje zdarzenia przeglądarki, takie jak naciśnięcia klawiszy i zmiany pozycji myszy, a także utrzymuje stan wewnętrzny. Następnie klasa gracza ma react()
metodę, która akceptuje obiekt wejściowy jako argument. Zaletą tego jest to, że obiekt wejściowy można przekształcić do postaci szeregowej w .JSON, a następnie udostępnić przez sieć, co pozwala na płynne symulacje dla wielu graczy.
Jak to się przekłada na system encji?