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 Player
bir varlıktır Position
, Velocity
ve KeyboardControlled
bariz şeyler bileşenleri.
entity Player:
Position
Velocity
KeyboardControlled
Biliyoruz Position
etkilenen edilmelidir Velocity
ve Velocity
tarafı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 Physics
sistem tüm Velocity
bileşenleri tarar Position
ve ilgili varlığın güncellenir ; bir Input
sistem tüm KeyboardControlled
bileş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. Velocity
güncellemelere KeyboardControlled
yanı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 (“ … Player
ile çarpıştığında Enemy
” ”) veya tek tek bileşenler düzeyinde (“ … Life
ile 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ı Tag
sağ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.