Niedawno stworzyłem prostą grę Space Invadors, używając „systemu bytów”. Jest to wzór, który bardzo dobrze oddziela atrybuty i zachowania. Pełne zrozumienie tego zajęło mi kilka iteracji, ale kiedy już zaprojektujesz kilka komponentów, tworzenie nowych obiektów przy użyciu istniejących komponentów staje się niezwykle proste.
Powinieneś przeczytać to:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Jest często aktualizowany przez niezwykle kompetentnego faceta. To także jedyna dyskusja na temat systemu encji z konkretnymi przykładami kodu.
Moje iteracje przebiegały następująco:
Pierwsza iteracja miała obiekt „EntitySystem”, który był jak opisuje Adam; jednak moje komponenty nadal miały metody - mój komponent „renderowalny” miał metodę paint (), a mój element pozycji miał metodę move () itp. Kiedy zacząłem tworzyć elementy, zdałem sobie sprawę, że muszę zacząć przekazywać wiadomości między komponenty i zlecanie wykonania aktualizacji komponentów .... zbyt bałagan.
Więc wróciłem i ponownie przeczytałem blog T-Machines. W wątkach komentarzy jest wiele informacji - w nich naprawdę podkreśla, że komponenty nie mają zachowań - zachowania są dostarczane przez systemy encji. W ten sposób nie trzeba przekazywać komunikatów między komponentami i zamawiać aktualizacji komponentów, ponieważ kolejność jest określona przez globalną kolejność wykonywania systemu. Dobrze. Może to zbyt abstrakcyjne.
W każdym razie dla iteracji nr 2 to właśnie poznałem z bloga:
EntityManager - działa jako komponent „baza danych”, do którego można wyszukiwać encje zawierające określone typy komponentów. Może to być nawet wspierane przez bazę danych w pamięci dla szybkiego dostępu ... zobacz t-machine część 5, aby uzyskać więcej informacji.
EntitySystem - każdy system jest w zasadzie tylko metodą działającą na zestawie entites. Każdy system użyje komponentu x, y i z encji, aby wykonać swoją pracę. Więc zapytasz menedżera o encje ze składnikami x, yiz, a następnie przekażesz ten wynik do systemu.
Podmiot - tylko identyfikator, jak długi. Encja jest tym, co grupuje zestaw instancji komponentów razem w „encję”.
Komponent - zestaw pól .... brak zachowań! kiedy zaczynasz dodawać zachowania, zaczyna się robić bałagan ... nawet w prostej grze Space Invadors.
Edycja : nawiasem mówiąc, „dt” to czas delta od ostatniego wywołania głównej pętli
Więc moja główna pętla Invadors jest następująca:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
Na początku wygląda trochę dziwnie, ale jest niesamowicie elastyczny. Jest również bardzo łatwy do optymalizacji; dla różnych typów komponentów możesz mieć różne zapasowe magazyny danych, aby przyspieszyć pobieranie. W przypadku klasy „form” można ją zabezpieczyć czterokrotnie, aby przyspieszyć dostęp do wykrywania kolizji.
Jestem jak Ty; Jestem doświadczonym programistą, ale nie miałem doświadczenia w pisaniu gier. Poświęciłem trochę czasu na badania, które dały wzorce twórców, a ten przykuł moją uwagę. Nie jest to w żaden sposób jedyny sposób na robienie rzeczy, ale uważam to za bardzo intuicyjne i niezawodne. Wierzę, że wzorzec ten został oficjalnie omówiony w książce 6 serii „Gem Programming Gems” - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Sam nie czytałem żadnej książki, ale słyszę, że są de facto odniesieniem do programowania gier.