Ben yaratıyorum bileşen tabanlı oyun nesne sistemini . Bazı ipuçları:
GameObjectsadece bir listesidirComponents.- Var
GameSubsystems. Örneğin, oluşturma, fizik vb. Her biriGameSubsystembazılarına işaretçiler içerirComponents.GameSubsystemçok güçlü ve esnek bir soyutlamadır: oyun dünyasının herhangi bir dilimini (veya yönünü) temsil eder.
Kayıt Componentsolma mekanizmasına ihtiyaç vardır GameSubsystems(ne zaman GameObjectyaratılır ve oluşturulursa). Orada 4 yaklaşımlar :
- 1: Sorumluluk zinciri modeli. Her
Componentşey herkese sunulurGameSubsystem.GameSubsystemhangiComponentskaydın kaydedileceğine (ve nasıl düzenleneceğine) karar verir. Örneğin GameSubsystemRender, Yenilenebilir Bileşenleri kaydedebilir.
pro. Componentsnasıl kullanıldıkları hakkında hiçbir şey bilmiyorlar. Düşük bağlantı. A. Biz yeni ekleyebilirsiniz GameSubsystem. Örneğin, tüm ComponentTitle'ı kaydeden GameSubsystemTitles'ı ekleyelim ve her başlığın benzersiz olduğunu garanti eden ve nesneleri sorguya göre başlığa arayüz sağlayan garanti edelim. Tabii ki, ComponentTitle bu durumda yeniden yazılmamalı veya devralınmamalıdır. B. Mevcut olanı yeniden düzenleyebiliriz GameSubsystems. Örneğin, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter, GameSubsystemSpatial ile birleştirilebilir (tüm sesleri, vericiyi yerleştirmek, Componentsaynı hiyerarşiye dönüştürmek ve üst göreli dönüşümleri kullanmak için).
con. Her kontrol. Çok verimsiz.
con. Subsystemshakkında bilmek Components.
- 2: Her biri belirli türleri
SubsystemararComponents.
pro. İçinden daha iyi performans Approach 1.
con. Subsystemshala biliyorum Components.
- 3:
Componentkendini kaydederGameSubsystem(s). Derleme zamanında bir GameSubsystemRenderer olduğunu biliyoruz, bu yüzden ComponentImageRender'ın GameSubsystemRenderer :: register (ComponentRenderBase *) gibi bir şey çağıralım.
pro. Verim. Gerektiği gibi gereksiz kontroller yok Approach 1.
con. Componentskötü bir şekilde birleşti GameSubsystems.
- 4: Arabulucu deseni.
GameState(içerenGameSubsystems) registerComponent (Component *) uygulayabilir.
pro. Componentsve GameSubystemsbirbirleri hakkında hiçbir şey bilmiyorlar.
con. C ++ 'da çirkin ve yavaş tipid anahtarı gibi görünecektir.
Sorular:
Hangi yaklaşım daha iyidir ve çoğunlukla bileşen tabanlı tasarımda kullanılır? Uygulama Ne Diyor? Uygulanması hakkında herhangi bir öneriniz var Approach 4mı?
Teşekkür ederim.
Componentsolmak sorumun GameObjectskapsamı dışında. Bileşen tabanlı yaklaşım hakkındaki makaleleri okuyun veya ilgileniyorsanız bu sitede kendi sorunuzu sorun. Ne düşündüğün GameSubsystemtamamen yanlış.