Bu, cevaplanması zor bir sorudur, çünkü herkesin bir varlık bileşeni sisteminin nasıl yapılandırılması gerektiği konusunda kendi fikri vardır. Yapabileceğim en iyi şey, benim için en yararlı olduğunu bulduğum bazı şeyleri sizinle paylaşmak.
varlık
ECS'ye yağ sınıfı yaklaşımı alıyorum, muhtemelen aşırı programlama yöntemlerini son derece verimsiz bulduğum için (insan verimliliği açısından). Bu amaçla benim için bir varlık, daha uzmanlaşmış sınıflar tarafından miras alınacak soyut bir sınıftır. Varlığın birkaç sanal özelliği ve bu varlığın var olup olmayacağını söyleyen basit bir bayrağı var. Bir render sistemi hakkındaki sorunuzla ilgili olarak, Entity
şöyle görünür:
public abstract class Entity {
public bool IsAlive = true;
public virtual SpatialComponent Spatial { get; set; }
public virtual ImageComponent Image { get; set; }
public virtual AnimationComponent Animation { get; set; }
public virtual InputComponent Input { get; set; }
}
Bileşenler
Bileşenler hiçbir şey yapmadıkları veya bilmedikleri için "aptalca" dırlar. Diğer bileşenlere hiçbir başvuruları yoktur ve genellikle işlevleri yoktur (C # 'da çalışırım, bu yüzden getters / setters işlemek için özellikler kullanırım - işlevlere sahiplerse, tuttukları verileri almayı temel alırlar).
Sistemler
Sistemler daha az "aptal" olmakla birlikte, hala aptal otomatlardır. Tüm sistemin bağlamı yoktur, diğer sistemlere referansları yoktur ve bireysel işlemlerini yapmak zorunda kalabilecekleri birkaç arabellek dışında veri içermezler. Sisteme bağlı olarak, bir uzman Update
veya Draw
yöntemi veya bazı durumlarda her ikisi de olabilir.
Arayüzler
Arayüzler sistemimdeki kilit yapıdır. Bir System
teneke kutuların neleri işleyebileceğini ve nelerin neler yapabileceğini tanımlamak için kullanılırlar Entity
. Oluşturma ile ilgili Arayüzler: IRenderable
ve IAnimatable
.
Arabirimler sisteme hangi bileşenlerin bulunduğunu söyler. Örneğin, oluşturma sisteminin varlığın sınırlayıcı kutusunu ve çizilecek görüntüyü bilmesi gerekir. Benim durumumda, olurdu SpatialComponent
ve ImageComponent
. Yani şöyle görünüyor:
public interface IRenderable {
SpatialComponent Component { get; }
ImageComponent Image { get; }
}
RenderingSystem
Peki, oluşturma sistemi bir varlığı nasıl çiziyor? Aslında oldukça basit, bu yüzden size bir fikir vermek için soyulmuş sınıfı göstereceğim:
public class RenderSystem {
private SpriteBatch batch;
public RenderSystem(SpriteBatch batch) {
this.batch = batch;
}
public void Draw(List<IRenderable> list) {
foreach(IRenderable obj in list) {
this.batch.draw(
obj.Image.Texture,
obj.Spatial.Position,
obj.Image.Source,
Color.White);
}
}
}
Sınıfa baktığımızda, render sistemi an'ın ne olduğunu bile bilmiyor Entity
. Tek bildiği şey, IRenderable
çizmek için sadece bir listesi verilir.
Her Şey Nasıl Çalışır
Yeni oyun nesnelerini nasıl oluşturduğumu ve bunları sistemlere nasıl beslediğimi de anlamaya yardımcı olabilir.
Varlıklar Oluşturma
Tüm oyun nesneleri Entity'den ve bu oyun nesnesinin neler yapabileceğini tanımlayan tüm uygulanabilir arayüzlerden devralınır. Ekranda canlandırılan hemen her şey şöyle görünür:
public class MyAnimatedWidget : Entity, IRenderable, IAnimatable {}
Sistemleri Besleme
Oyun dünyasında var olan tüm varlıkların listesini tek bir listede tutuyorum List<Entity> gameObjects
. Her kare, sonra o liste üzerinden elemek ve List<IRenderable> renderableObjects
, ve gibi arabirim türüne dayalı daha fazla listeye nesne başvuruları kopyalayın List<IAnimatable> animatableObjects
. Bu şekilde, farklı sistemlerin aynı varlığı işlemesi gerekiyorsa yapabilirler. Daha sonra bu listeleri sistemlerin Update
veya Draw
yöntemlerin her birine teslim ediyorum ve sistemlerin işlerini yapmasına izin veriyorum .
Animasyon
Animasyon sisteminin nasıl çalıştığını merak ediyor olabilirsiniz. Benim durumumda IAnimatable arayüzünü görmek isteyebilirsiniz:
public interface IAnimatable {
public AnimationComponent Animation { get; }
public ImageComponent Image { get; set; }
}
Burada dikkat edilmesi gereken ImageComponent
en önemli şey , IAnimatable
arayüzün sadece okunabilir olmamasıdır; bir ayarlayıcı var .
Tahmin edebileceğiniz gibi, animasyon bileşeni sadece animasyon hakkındaki verileri tutar; kare listesi (görüntü bileşenleri olan), geçerli kare, çizilecek saniye başına kare sayısı, son kare artışından bu yana geçen süre ve diğer seçenekler.
Animasyon sistemi, oluşturma sistemi ve görüntü bileşeni ilişkisinden yararlanır. Animasyonun çerçevesini artırdıkça objenin görüntü bileşenini değiştirir. Bu şekilde, animasyon dolaylı olarak oluşturma sistemi tarafından oluşturulur.