Bu, cevapladığım bu sorunun bir takibi , ama bu çok daha spesifik bir konuyla başa çıkıyor.
Bu cevap Entity Systems'ı makaleden daha iyi anlamama yardımcı oldu.
Entity Systems hakkındaki (evet,) makaleyi okudum ve bana şunları söyledi:
Varlıklar sadece bir kimlik ve bir bileşen dizisidir (makaleler, varlıkları bileşenlerde depolamanın bir şeyler yapmak için iyi bir yol olmadığını, ancak bir alternatif sunmadığını söylüyor).
Bileşenler , belirli bir varlıkla neler yapılabileceğini gösteren veri parçalarıdır.
Sistemler "yöntemler" dir, varlıklar üzerindeki verilerin manipülasyonunu yaparlar.
Bu birçok durumda gerçekten pratik gibi görünüyor, ancak bileşenlerin sadece veri sınıfları olmasıyla ilgili kısım beni rahatsız ediyor. Örneğin, Vector2D sınıfımı (Pozisyon) bir Varlık Sistemine nasıl uygulayabilirim?
Vector2D sınıfı verileri tutar: x ve y koordinatları, ancak kullanışlılığı için çok önemli olan ve sınıfı sadece iki elemanlı bir diziden ayıran yöntemlere de sahiptir . Örnek yöntemler şunlardır: add()
, rotate(point, r, angle)
, substract()
, normalize()
, ve diğer tüm standardı, ve kesinlikle gerekli yöntemleri (Vector2D sınıfının örnekleridir) konumları olması gerektiğini.
Bileşen yalnızca bir veri sahibi olsaydı, bu yöntemlere sahip olamazdı!
Muhtemelen ortaya çıkabilecek bir çözüm, bunları sistemlerin içine uygulamak olabilir, ancak bu çok sezgisel görünüyor. Bu yöntemler şimdi gerçekleştirmek istediğim , tam ve kullanıma hazır olmasını istediğim şeyler . MovementSystem
Bir varlığın pozisyonunda bir hesaplama yapmasını söyleyen bazı pahalı mesajları okumak için beklemek istemiyorum !
Makale, sadece sistemlerin herhangi bir işlevselliğe sahip olması gerektiğini açıkça belirtiyor ve bunun için bulabildiğim tek açıklama "OOP'dan kaçınmak" idi. Her şeyden önce, varlıklarda ve bileşenlerde yöntemleri kullanmaktan neden kaçınmam gerektiğini anlamıyorum. Bellek yükü pratik olarak aynıdır ve sistemlerle birleştiğinde bunların uygulanması ve ilginç şekillerde birleştirilmesi çok kolay olmalıdır. Örneğin sistemler, yalnızca uygulamayı bilen varlıklara / bileşenlere temel mantık sağlayabilir. Bana sorarsanız - bu temel olarak hem ES hem de OOP'tan güzellikler alıyor, makalenin yazarına göre yapılamayan bir şey, ama bana göre iyi bir uygulama gibi görünüyor.
Bu şekilde düşünün; oyunda birçok farklı çekilebilir nesne türü vardır. Sade eski görüntüler, animasyonlar ( update()
, getCurrentFrame()
vb.), Bu ilkel türlerin kombinasyonları ve hepsi draw()
render sistemine bir varlık sağlayabilir, bu da bir varlığın sprite'ın nasıl uygulandığını umursamaya gerek yoktur, sadece arayüz (çizim) ve pozisyon hakkında. Ve sonra, yalnızca oluşturma ile ilgisi olmayan animasyona özgü yöntemleri çağıracak bir animasyon sistemine ihtiyacım olacaktı.
Ve bir şey daha ... Bileşenleri saklama konusunda dizilere gerçekten bir alternatif var mı? Bir Entity sınıfındaki dizilerden başka bileşenlerin depolanacağı başka bir yer göremiyorum ...
Belki de bu daha iyi bir yaklaşımdır: bileşenleri varlıkların basit özellikleri olarak saklayın. Örneğin, bir konum bileşenine yapıştırılabilir entity.position
.
Diğer tek yol , farklı varlıklara gönderme yapan sistemlerin içinde garip bir arama tablosuna sahip olmaktır . Ancak bu, bileşenlerin yalnızca varlıkta depolanmasından çok, verimsiz ve daha karmaşık görünmektedir .