Baru-baru ini saya membuat game Space Invadors sederhana menggunakan 'sistem entitas'. Ini adalah pola yang memisahkan atribut dan perilaku dengan sangat baik. Butuh beberapa iterasi untuk sepenuhnya memahaminya, tetapi begitu Anda mendapatkan beberapa komponen yang dirancang, menjadi sangat mudah untuk membuat objek baru menggunakan komponen yang ada.
Anda harus membaca ini:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Itu sering diperbarui oleh orang yang sangat berpengetahuan. Ini juga satu-satunya diskusi sistem entitas dengan contoh kode konkret.
Iterasi saya berjalan sebagai berikut:
Iterasi pertama memiliki objek "EntitySystem" yang seperti yang dijelaskan Adam; Namun komponen saya masih memiliki metode - komponen saya 'dapat diajak' memiliki metode pengecatan (), dan komponen posisi saya memiliki metode pemindahan () dan lain-lain. Ketika saya mulai menyempurnakan entitas, saya menyadari bahwa saya perlu mulai menyampaikan pesan di antara komponen dan memesan pelaksanaan pembaruan komponen .... terlalu berantakan.
Jadi, saya kembali dan membaca kembali blog T-Machines. Ada banyak informasi di utas komentar - dan di dalamnya ia sangat menekankan bahwa komponen tidak memiliki perilaku - perilaku disediakan oleh sistem entitas. Dengan cara ini Anda tidak perlu mengirimkan pesan antara komponen dan memesan pembaruan komponen karena pemesanan ditentukan oleh urutan global pelaksanaan sistem. Baik. Mungkin itu terlalu abstrak.
Pokoknya untuk iterasi # 2 inilah yang saya dapatkan dari blog:
EntityManager - bertindak sebagai komponen "basis data", yang dapat ditanyakan untuk entitas yang berisi jenis komponen tertentu. Ini bahkan dapat didukung oleh database dalam-memori untuk akses cepat ... lihat t-machine bagian 5 untuk info lebih lanjut.
EntitySystem - Setiap sistem pada dasarnya hanyalah sebuah metode yang beroperasi pada set entites. Setiap sistem akan menggunakan komponen x, y dan z suatu entitas untuk menyelesaikan pekerjaannya. Jadi Anda akan meminta manajer untuk entitas dengan komponen x, y dan z kemudian meneruskan hasilnya ke sistem.
Entity - hanya id, seperti panjang. Entitas adalah apa yang dikelompokkan sekelompok contoh komponen bersama menjadi 'entitas'.
Komponen - seperangkat bidang .... tidak ada perilaku! ketika Anda mulai menambahkan perilaku itu mulai menjadi berantakan ... bahkan dalam permainan Space Invadors yang sederhana.
Sunting : omong-omong, 'dt' adalah waktu delta sejak doa loop utama terakhir
Jadi loop Invadors utama saya adalah ini:
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);
Awalnya terlihat agak aneh, tetapi sangat fleksibel. Ini juga sangat mudah untuk dioptimalkan; untuk tipe komponen yang berbeda, Anda dapat memiliki datastore dukungan yang berbeda untuk mempercepat pengambilan. Untuk kelas 'form' Anda dapat membuatnya didukung dengan quadtree untuk mempercepat akses untuk deteksi tabrakan.
Aku seperti kamu; Saya adalah pengembang berpengalaman tetapi tidak memiliki pengalaman menulis game. Saya menghabiskan beberapa waktu meneliti pola dev, dan yang ini menarik perhatian saya. Ini sama sekali bukan satu-satunya cara untuk melakukan sesuatu, tetapi saya merasa sangat intuitif dan kuat. Saya percaya pola ini secara resmi dibahas dalam buku 6 dari seri "Game Programming Gems" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Saya sendiri belum membaca buku-buku itu tetapi saya dengar itu adalah referensi de-facto untuk pemrograman game.