Son zamanlarda bir 'varlık sistemi' kullanarak basit bir Space Invadors oyunu yaptım. Nitelikleri ve davranışları son derece iyi ayıran bir örüntüdür. Tamamen anlamak için birkaç tekrar aldı, ancak birkaç bileşen tasarlandıktan sonra, mevcut bileşenlerinizi kullanarak yeni nesneler oluşturmak son derece basitleşiyor.
Bunu okumalısınız:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Son derece bilgili bir adam tarafından sık sık güncellenir. Aynı zamanda somut kod örnekleri ile tek varlık sistemi tartışmasıdır.
Yinelemelerim şöyle:
İlk yinelemenin Adem'in tanımladığı gibi bir "EntitySystem" nesnesi vardı; ancak bileşenlerim hala yöntemlere sahipti - 'yenilenebilir' bileşenim bir paint () yöntemine sahipti ve konum bileşenim bir move () yöntemine vb. sahipti. bileşenleri ve bileşen güncellemeleri yürütme sipariş .... çok dağınık.
Bu yüzden geri döndüm ve T-machines blogunu tekrar okudum. Yorum dizilerinde çok fazla bilgi var - ve içlerinde bileşenlerin davranışları olmadığını vurguluyor - varlık sistemleri tarafından sağlanan davranışlar. Bu şekilde, bileşenler sistem yürütme sırasının genel sırası tarafından belirlendiği için, bileşenler arasında mesaj geçirmeniz ve bileşen güncellemeleri sipariş etmeniz gerekmez . Tamam. Belki bu çok soyut.
Neyse yineleme # 2 için bu blogdan topladım:
EntityManager - belirli türdeki bileşenleri içeren varlıklar için sorgulanabilen "veritabanı" bileşeni olarak işlev görür. Bu, hızlı erişim için bir bellek içi veritabanı tarafından da desteklenebilir ... daha fazla bilgi için t-makine bölüm 5'e bakın.
EntitySystem - Her sistem aslında sadece bir dizi entre üzerinde çalışan bir yöntemdir. Her sistem, bir işin işini yapmak için x, y ve z bileşenlerini kullanır. Böylece yöneticiyi x, y ve z bileşenlerine sahip varlıklar için sorgulayacak ve daha sonra bu sonucu sisteme ileteceksiniz.
Varlık - sadece bir kimlik, uzun gibi. Varlık, bir dizi bileşen örneğini birlikte bir 'varlık' olarak gruplayan şeydir.
Bileşen - bir dizi alan .... davranış yok! davranış eklemeye başladığınızda, basit bir Space Invadors oyununda bile dağınık olmaya başlar.
Düzenleme : bu arada, 'dt' son ana döngü çağrısından beri delta zamanı
Benim ana Invadors döngü budur:
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);
İlk başta biraz garip görünüyor, ama inanılmaz derecede esnek. Optimize etmek de çok kolay; farklı bileşen türleri için, daha hızlı erişim sağlamak için farklı destek veri depolarına sahip olabilirsiniz. 'Form' sınıfı için, çarpışma tespiti için erişimi hızlandırmak üzere dörtlü ile destekleyebilirsiniz.
Ben senin gibiyim; Tecrübeli bir geliştiriciyim ama oyun yazma konusunda deneyimim yoktu. Araştırma yapmak için biraz zaman harcadım dev kalıpları verdim ve bu gözüme çarptı. Hiçbir şey yapmanın tek yolu bu değil, ama bunu çok sezgisel ve sağlam buldum. Desenin resmi olarak "Oyun Programlama Taşları" dizisinin 6. kitabında tartışıldığına inanıyorum - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Hiçbir kitabı kendim okumadım ama oyun programlama için fiili referans olduklarını duydum.