Apakah Anda memiliki Kerangka Sistem Entitas?

12

Saya telah membaca Kerangka Sistem Entitas khusus Artemis. Saya mencoba memutuskan apakah itu tepat untuk saya. Saya benar-benar bekerja pada game art pixel 2d berbasis ubin, dan saya tidak berpikir mereka akan menjadi sumber daya yang intensif. Saya selalu menggunakan OOP standar dengan banyak warisan di masa lalu.

Pemahaman saya tentang Kerangka Kerja Sistem Entitas saat ini (saya belum yakin apakah saya sudah sepenuhnya memahami) adalah:

  • Entitas tidak lain adalah ID
  • Komponen tidak lain adalah data bodoh yang ditambahkan ke kumpulan komponen entitas
  • Sistem adalah fungsi pembaruan yang melekat pada dunia untuk menangani setiap entitas yang cocok dengan tanda tangan komponen Sistem

Jika pemahaman saya benar maka saya mengalami sedikit kesulitan mengkonsep menambahkan tilemaps dan Pohon Perilaku AI ke dalam kerangka kerja ini. Saya akan bertanya tentang AI di masa depan.

Haruskah tilemap dibangun ke dalam kerangka kerja ini? Atau haruskah disimpan terpisah agar mudah dibuat dengan editor tilemap?

Jika tilemap harus dibangun ke dalam kerangka kerja ini, apakah setiap ubin entitas yang berbeda? Dan tilemap suatu sistem? Atau apakah tilemap itu sendiri merupakan entitas tunggal dengan warisan yang dibangun darinya?

Jika tilemap sperate, apa cara terbaik untuk mendeteksi entitas terhadap tilemap eksternal?

Saya mengerti bahwa beberapa opsi yang telah saya daftarkan mungkin benar, tetapi jika ada orang yang telah melakukan ini di masa lalu, mereka mungkin dapat menjelaskan kebingungan saya. Mungkin ada alternatif lain yang belum saya pikirkan?

Terima kasih.

Spencer Marr
sumber
Catatan yang sepenuhnya acak, koordinat X / Y juga berfungsi sebagai ID. Bukannya saya menyarankan Anda menerapkannya dalam sistem entitas Anda, tetapi, Anda dapat melampirkan efek ke ubin Anda dengan cara yang sama seperti Anda dalam sistem entitas.
William Mariager
Hei, hanya meneruskan saran Byte56: komponen tidak benar-benar perlu menjadi pemegang data bodoh. Terkadang akan berguna jika mereka benar-benar dapat mengoperasikan data itu; vektor, misalnya.
jcora
Saya sangat suka saran ini juga. Saya dapat menambahkan tilemaps ke dalam kerangka entitas tanpa harus memisahkan tilemap helper dari data, atau harus memecah tilemap menjadi beberapa komponen / entitas.
Spencer Marr
Tilemap hanyalah komponen lain, dan sistem collision dan sistem renderer menangani collision dengan tilemap dan rendering tilemap
Kikaimaru

Jawaban:

8

Saya menerapkan kerangka komponen entitas (mirip dengan Artemis) setelah saya sudah dalam pengembangan untuk sementara waktu, tetapi saya tidak berpikir saya akan melakukan hal-hal yang berbeda jika mulai dari batu tulis kosong.

Dunia saya benar-benar terpisah dari kerangka entitas. Tidak masuk akal bagi saya untuk mengubah dunia menjadi semacam entitas atau kumpulan entitas. Dunia saya adalah 3D dengan kubus, tapi saya percaya hal yang sama berlaku untuk ubin. Entitas membentuk segalanya di dunia, tetapi medannya terpisah. Namun, ketika kubus dihapus, mereka memang menelurkan entitas "material".

Deteksi tabrakan tidak terlalu sulit untuk diikat. Dunia Anda mungkin memiliki isSolidAt(x,y)metode tipe yang akan digunakan sistem tabrakan Anda. Kejujuran, saya sudah mengatakan ini sekali hari ini dalam jawaban yang berbeda , lakukan apa pun yang paling masuk akal bagi Anda. Anda tidak melanggar aturan apa pun dengan membuat petak peta terpisah atau menjadikannya entitas. Apa pun yang bisa Anda lekatkan adalah yang terbaik. Bagi saya, itu membuat dunia terpisah dan membuat segalanya menjadi entitas.

MichaelHouse
sumber
1
Katakan peta saya adalah entitas. Bagaimana entitas lain akan mengakses metode peta isSolidAt?
Gerardo Marset
Menyimpan peta sebagai entitas mungkin bukan ide bagus untuk situasi ini saja. Saya kira Anda harus berkomunikasi langsung dengannya dalam situasi ini. Sistem yang bertanggung jawab atas entitas peta akan memiliki akses ke entitas peta, dan dapat mengambil informasi dari entitas itu ketika diminta.
MichaelHouse
4

Saya menambahkan tilemap sebagai komponen terpisah ke entitas (dengan semua ubin di dalamnya) dan ada juga penyaji yang terpisah untuk peta ubin, jadi saya dapat merendernya dalam 3d atau 2d. Untuk membuat semua ubin sebagai entitas adalah mungkin tetapi mahal.

sesuatu seperti itu:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

manfaat dalam memisahkan gambar dari logika adalah ide dasar dari pola MVC

Yevhen
sumber
1
Seluruh tilemap terkandung dalam satu komponen? Apakah itu melekat pada semacam entitas / master entitas lingkungan game? Saya bisa melihat manfaat yang cukup besar diperoleh dengan memisahkan render-er dari komponen tilemap.
Spencer Marr
Terima kasih telah memperbarui jawaban Anda! Saya suka cuplikan kode.
Spencer Marr