Bileşen tabanlı mimari için uygun bir ayrıntı düzeyi nedir?


26

Bileşen tabanlı mimariye sahip bir oyun üzerinde çalışıyorum. Bir Entitybir dizi sahibi Componenttakımı olup, her biri durumlarda, Slotdepolamak gönderme ve değerlerini almak için hangi durumlarda. PlayerGerekli bileşenler ve yuva bağlantılarına sahip varlıklar üretmek gibi fabrika fonksiyonları .

Bileşenler için en iyi ayrıntı düzeyini belirlemeye çalışıyorum. Örneğin, şu anda Position, Velocityve Accelerationseri olarak bağlı olan tüm ayrı parçalar vardır. Velocityve Accelerationkolay bir şekilde homojen olarak yeniden yazılabilir Deltabileşen veya Position, Velocityve Accelerationgibi bileşenler ile birlikte kombine edilebilir Frictionve Gravitybir yekpare halinde Physicsbileşen.

Bir bileşen mümkün olan en küçük sorumluluğa mı sahip olmalı (çok sayıda bağlantının pahasına) veya ilgili parçalar tek parça halinde (esneklik pahasına) birleştirilmeli midir? Birincisine yaslanıyorum, ancak ikinci bir görüş kullanabilirim.



Kendi fizik motorunuzu mu kullanacaksınız yoksa mevcut olanı mı entegre edeceksiniz?
Den

@Den: Bazı fizik kodları yazıyorum ama bu hiçbir şekilde bir motor değil . Sadece sıradan 2D kinematik.
Jon Purdy

Yanıtlar:


14

Tam bir ayrıntı düzeyi ile kod israfı veya blok benzeri bir durum (bileşen yapılarının tercih edilmesinin nedeni budur) ve kullanılabilirlik arasında bir çizgi vardır.

Açıkçası işler bir olabilir Position, ancak mutlaka dinamik olmaları gerekmez (öyleyse neden Velocityve Acceleration?). Bununla birlikte, Velocitya ile hareket eden bir nesne hareket edecektir, bu yüzden Accelerationgruplandırılmış olması da anlamlıdır .

Zaman dava edecek misiniz v ve bir ihtiyaç olacak, ancak onlar için bir fizik simülasyonu istemiyor musunuz? Benzer şekilde, Gravityeğer fizik nesnesi değilse de bir nokta olacak mı?

tl; dr Grup neyin anlamlı olduğunu.


1
Adil geliyor. Benim sistem çok az merkeziyetçiliği vardır: Bir varsa Entitybir sahip Positionolun ve bazı bileşenleri Positionfizikte katılmak, daha sonra Entityise fiili fiziksel. Yapabileceğim şey sadece mantıksal gruplama için bazı bileşenler eklemek ve tüm temel bileşenleri tek bir sorumluluk altında tutmak. Ekleyerek, diyelim ki, bir Yani Movablebir karşı Entityekleyerek bir aynı etkiye sahip olacaktır Position, Velocityve Acceleration.
Jon Purdy

6

Ağır başlatarak önerdiğim her değişkeni mikro yönetmekten kaçınmak için, durumun kendisini mantıklı bir şekilde ortaya koyduğu zaman sorumluluk ve refraktör çevresinde bölümler seçin. İlk tasarımları kağıt üzerinde başlatabilirsiniz. Bir noktada, bu brüt sorumluluk bölümleri, işletmelerinizin yapı taşları olacaktır.

Yani aceleci bir örnek için Oyun var. Oyun Çevre + Devlet içine böler. Ortam, StaticWorld + MovingStuff'a ayrılır. Devlet AIControlled + PlayerControlled içine bölünür. Hasar brüt fikri TakesDamage + GivesDamage'e ayrılır.

Ve bunun gibi.

"Motor değil, oyun oluşturun!" Yeni pratisyenler için "Oyun oynamayı, bileşen bileşenlerini geliştirmeyi değil!" Çünkü sadece çalışan bir oyundaki kişisel deneyimlerinizle, gelecekteki çalışmalarda ayrıntılı bir bileşen sisteminin çağrılıp çağrılmayacağını bilirsiniz.


Ben yeni bir geliştirici değilim. Eğer davranıştan ziyade kavramlara dayanan bileşenlere sahipsem (yani yukarıdan aşağıya ve yukarıdan aşağıya), mimarlığım daha kırılgan ve daha ayrıntılı olmaz mı? Küçük bileşenlerden istediğim herhangi bir davranışı uygulayabilirim, ancak önceden belirlenmiş olanlardan her zaman istenen davranışı alamıyorum. Bir oyun bağlamında bile elde etmek istediğim her şeyi tahmin edemediğimden bahsetmiyorum bile.
Jon Purdy

Aşağıdan yukarıya dezavantajı, bileşenler arasındaki iletişimin bir sorun haline gelmesi ve insanlar modellediklerinin ölçeğinde çok fazla mikro başlama eğiliminde olmalarıdır. Esas olarak süper-mikrodan uzaklaşmaya çalışıyordum "xyz bir bileşendir" "rotasyon bir bileşendir" "rgb bir bileşendir" seviyesi tecrübesiz biri için.
Patrick Hughes,

Yeterince adil. Sadece seni doğru anladığımdan emin olmak istedim. Sahip olduğum slot sistemiyle, bileşenlerin iletişim kurması basit ve etkilidir, bu yüzden "süper mikro" ölçeğinde herhangi bir dezavantaj göremiyorum. Bunu bağımsız bir motora dönüştürmek niyetinde değilim, ancak yaparsam, Komünist Ördek'in cevabı hakkındaki yorumumda bahsettiğim bileşen grupları gibi soyutlamaları her zaman yapabilirim.
Jon Purdy

4

Benim tahminim, çok fazla etkileşime girecek bileşenleri birleştirmek olacaktır. Senin durumunda, pozisyonu tek bir bileşende tutardım ve hız ve ivmelenmeyi bir fizik bileşeninde bir arada tutardım.

Ancak oyun özelliklerinin ne olduğuna bağlı olarak değişir (akılda belirli bir oyun içermeyen bir çerçeve oluşturmazsanız).


2
Bileşenleri çok fazla etkileşimle birleştirmekle ilgili sorun bazen diğer bölüme ihtiyaç duyulmamasıdır.
Komünist Ördek

4

Bunun eski bir soru olduğunu biliyorum ama belki birileri bu cevabı faydalı bulabilir.

Bunun SystemsBileşenleri nasıl oluşturacağınızı anlamanıza yardımcı olacağına inanıyorum . Basit alıcı / ayarlayıcılar ve yardımcı işlevlerin yanı sıra, bileşenlerin kendi mantıklarını içermediği mimarilerde sistemler mevcuttur. Sistem, Bileşen gereksinimlerini karşılayan Varlıklar üzerinde çalışır. Bu nedenle, diğer verilerin olmadan işlenebilmesi için bileşen verilerini ayırmanın en iyi yolu budur.

Örneğin, MovementSystemVarlıklarını ' Positionbaz alarak güncelleyen bir tanesine sahip olabilirsiniz Velocity. Bu oyunda basit varlıklar için olabilir. Ancak, Oyuncu ve DüşmanlarAcceleration için işlenmiş olan hareketi isteyebilirsiniz AcceleratedMovementSystem. Ancak isteyebileceğiniz Engeller için Friction. Arazi ayrıca sürtünmeyi sahip olabilir, ama bir hız bileşenine sahip olmayacaktır. Peki ya Gravity? Sadece Oynatıcı, Düşman ve Engel'i ekleyin ve GravitySystemonu işlemek için bir yaratın .

Sonuçta daha olmasıdır ayrılmış senin Components, daha vardır genişletilebilirEntities kullanırken olacak Systems.

Düzenleme: Son ifadeyi daha net hale getirdi.

Düzenleme: Tamam, kendi Sistem üzerinde çalışıyorum ve bu gerçekleştirmeye geldi. Konum ve Hızı bölmek için bir örnek, Hızı değiştirmek, Konumun bir MovementSystem ile değişmesine neden olmasıdır. Sonuç olarak, bir 'InputMovementSystem', Oynatıcının kullanıcı Girdisinden hareket etmesine neden olacak bir Konum'a ihtiyaç duymaz çünkü MovementSystem, Konum'a uygulamak için Hızdaki değişiklikleri toplayacaktır. Verilen, onları bir araya getirmek için hala iyi çalışacak, ancak bu neden olmadığına dair bir örnek.


Son zamanlarda böyle bir şey söyleyen bir blog yazısını okudum:

"2 farklı bileşenle gruplandırılabilecek verileriniz varsa, bu verilerle üçüncü bir bileşen oluşturmak en iyisidir."

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.