Estou criando um sistema de objetos de jogo baseado em componentes . Algumas dicas:
GameObject
é simplesmente uma lista deComponents
.- Existem
GameSubsystems
. Por exemplo, renderização, física etc. Cada umGameSubsystem
contém ponteiros para alguns delesComponents
.GameSubsystem
é uma abstração muito poderosa e flexível: representa qualquer fatia (ou aspecto) do mundo do jogo.
Há uma necessidade em um mecanismo de registrar Components
em GameSubsystems
(quando GameObject
é criado e composto). Existem 4 abordagens :
- 1: Padrão de cadeia de responsabilidade . Tudo
Component
é oferecido a todosGameSubsystem
.GameSubsystem
toma uma decisão sobre qualComponents
registro (e como organizá-los). Por exemplo, GameSubsystemRender pode registrar componentes renderizáveis.
pró. Components
não sabem nada sobre como eles são usados. Baixo acoplamento. A. Nós podemos adicionar novos GameSubsystem
. Por exemplo, vamos adicionar o GameSubsystemTitles que registra todo o ComponentTitle e garante que cada título seja exclusivo e fornece interface para consultar objetos por título. Obviamente, ComponentTitle não deve ser reescrito ou herdado neste caso. B. Nós podemos reorganizar os existentes GameSubsystems
. Por exemplo, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter podem ser mesclados em GameSubsystemSpatial (para colocar todo o áudio, emmiter, renderizar Components
na mesma hierarquia e usar transformações relativas aos pais).
vigarista. Cheque de todos para todos. Muito ineficiente.
vigarista. Subsystems
conhecer Components
.
- 2: Cada um
Subsystem
procura porComponents
tipos específicos.
pró. Melhor desempenho do que em Approach 1
.
vigarista. Subsystems
ainda conhece Components
.
- 3:
Component
registra-se emGameSubsystem(s)
. Sabemos em tempo de compilação que existe um GameSubsystemRenderer, então vamos ComponentImageRender chamará algo como GameSubsystemRenderer :: register (ComponentRenderBase *).
pró. Atuação. Sem verificações desnecessárias como em Approach 1
.
vigarista. Components
estão mal associados GameSubsystems
.
- 4: Padrão do mediador .
GameState
(que contémGameSubsystems
) pode implementar registerComponent (Component *).
pró. Components
e GameSubystems
não sabem nada um do outro.
vigarista. Em C ++, pareceria um switch tipo-tipo feio e lento.
Perguntas:
Qual abordagem é melhor e mais usada no design baseado em componentes? O que a prática diz? Alguma sugestão sobre a implementação de Approach 4
?
Obrigado.
Components
em GameObjects
está fora do escopo da minha pergunta. Leia artigos sobre a abordagem baseada em componentes ou faça sua própria pergunta neste site, se estiver interessado nela. O que você pensa GameSubsystem
é totalmente errado.