Ben yaratıyorum bileşen tabanlı oyun nesne sistemini . Bazı ipuçları:
GameObject
sadece bir listesidirComponents
.- Var
GameSubsystems
. Örneğin, oluşturma, fizik vb. Her biriGameSubsystem
bazı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 Components
olma mekanizmasına ihtiyaç vardır GameSubsystems
(ne zaman GameObject
yaratılır ve oluşturulursa). Orada 4 yaklaşımlar :
- 1: Sorumluluk zinciri modeli. Her
Component
şey herkese sunulurGameSubsystem
.GameSubsystem
hangiComponents
kaydın kaydedileceğine (ve nasıl düzenleneceğine) karar verir. Örneğin GameSubsystemRender, Yenilenebilir Bileşenleri kaydedebilir.
pro. Components
nası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, Components
aynı hiyerarşiye dönüştürmek ve üst göreli dönüşümleri kullanmak için).
con. Her kontrol. Çok verimsiz.
con. Subsystems
hakkında bilmek Components
.
- 2: Her biri belirli türleri
Subsystem
ararComponents
.
pro. İçinden daha iyi performans Approach 1
.
con. Subsystems
hala biliyorum Components
.
- 3:
Component
kendini 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. Components
kötü bir şekilde birleşti GameSubsystems
.
- 4: Arabulucu deseni.
GameState
(içerenGameSubsystems
) registerComponent (Component *) uygulayabilir.
pro. Components
ve GameSubystems
birbirleri 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 4
mı?
Teşekkür ederim.
Components
olmak sorumun GameObjects
kapsamı dışında. Bileşen tabanlı yaklaşım hakkındaki makaleleri okuyun veya ilgileniyorsanız bu sitede kendi sorunuzu sorun. Ne düşündüğün GameSubsystem
tamamen yanlış.