Giriş
Varlık bileşen sistemleri, nesne yönelimli bir mimari tekniktir.
Nesneye yönelik programlamayla aynı terimin ne anlama geldiğine dair evrensel bir fikir birliği yoktur. Ancak, varlık-bileşen sistemlerinin özellikle mirasa mimari bir alternatif olarak tasarlandığı açıktır . Kalıtım hiyerarşileri bir nesne neyi ifade etmek için doğal olduğunu , ancak (oyunlar gibi) yazılımının belirli türlü, yerine bir nesne neyi ifade edersiniz yapar .
C ++ veya Java'da çalışmaya alışık olduğunuz “sınıflar ve miras” modelinden farklı bir nesne modelidir. Varlıklar sınıflar kadar etkileyici, tıpkı JavaScript veya Self'deki gibi prototipler gibi - bu sistemlerin hepsi birbirleri açısından uygulanabilir.
Örnekler
Hadi diyelim ki Playerbir varlıktır Position, Velocityve KeyboardControlledbariz şeyler bileşenleri.
entity Player:
Position
Velocity
KeyboardControlled
Biliyoruz Positionetkilenen edilmelidir Velocityve Velocitytarafından KeyboardControlled. Soru, bu etkileri nasıl modellemek istediğimizdir.
Varlıklar, Bileşenler ve Sistemler
Bileşenlerin birbirlerine referansları olmadığını varsayalım; harici bir Physicssistem tüm Velocitybileşenleri tarar Positionve ilgili varlığın güncellenir ; bir Inputsistem tüm KeyboardControlledbileşenleri tarar ve Velocity.
Player
+--------------------+
| Position | \
| | Physics
/ | Velocity | /
Input | |
\ | KeyboardControlled |
+--------------------+
Bu kriterleri karşılar:
Sistemler artık olayları işlemekten ve bileşenler tarafından açıklanan davranışı canlandırmaktan sorumludur . Ayrıca, çarpışmalar gibi varlıklar arasındaki etkileşimlerin ele alınmasından da sorumludurlar.
Varlıklar ve Bileşenler
Ancak, bileşenler varsayalım yapmak birbirlerine göndermeler var. Şimdi varlık basitçe bazı bileşenler oluşturan, bunları birbirine bağlayan ve ömürlerini yöneten bir kurucudur:
class Player:
construct():
this.p = Position()
this.v = Velocity(this.p)
this.c = KeyboardControlled(this.v)
Varlık artık girdi ve güncelleme olaylarını doğrudan bileşenlerine gönderebilir. Velocitygüncellemelere KeyboardControlledyanıt verir ve girdiye yanıt verir. Bu hala kriterlerimizi karşılıyor:
İşletme, olayları yalnızca bileşenlere ileten “aptal” bir kaptır.
Her bileşen kendi davranışını gerçekleştirir.
Burada bileşen etkileşimleri açıktır, bir sistem tarafından dışarıdan dayatılmamıştır. Bir davranışı tanımlayan veriler (hız miktarı nedir?) Ve onu etkileyen kod (hız nedir?) Birleştirilir, ancak doğal bir şekilde. Veriler davranışın parametreleri olarak görülebilir. Ve bazı bileşenler hiç hareket etmiyor - a bir yerde olmanınPosition davranışı .
Etkileşimler, işletme düzeyinde (“ … Playerile çarpıştığında Enemy” ”) veya tek tek bileşenler düzeyinde (“ … Lifeile bir işletmeyle çarpıştığında Strength”) gerçekleştirilebilir.
Bileşenler
İşletmenin var olmasının nedeni nedir? Sadece bir kurucu ise, onu bir bileşen seti döndüren bir işlevle değiştirebiliriz . Daha sonra varlıkları türlerine göre sorgulamak istiyorsak, bunu yapmamızı Tagsağlayan bir bileşene de sahip olabiliriz :
function Player():
t = Tag("Player")
p = Position()
v = Velocity(p)
c = KeyboardControlled(v)
return {t, p, v, c}
Etkileşimler artık olay türlerini olay türlerinden tamamen ayıran soyut sorgular tarafından ele alınmalıdır . Sorgulanacak başka varlık türü yokTag ; hata ayıklama için isteğe bağlı veriler muhtemelen oyun mantığından daha iyi kullanılır.
Sonuç
Varlıklar işlevler, kurallar, aktörler veya veri akışı birleştiricileri değildir. Bunlar isimler modeli beton fenomenler; başka bir deyişle, bunlar nesnelerdir. Wikipedia'nın dediği gibi — varlık-bileşen sistemleri genel nesneleri modellemek için kullanılan bir yazılım mimarisi modelidir.