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 umGameSubsystemconté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 Componentsem GameSubsystems(quando GameObjecté criado e composto). Existem 4 abordagens :
- 1: Padrão de cadeia de responsabilidade . Tudo
Componenté oferecido a todosGameSubsystem.GameSubsystemtoma uma decisão sobre qualComponentsregistro (e como organizá-los). Por exemplo, GameSubsystemRender pode registrar componentes renderizáveis.
pró. Componentsnã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 Componentsna mesma hierarquia e usar transformações relativas aos pais).
vigarista. Cheque de todos para todos. Muito ineficiente.
vigarista. Subsystemsconhecer Components.
- 2: Cada um
Subsystemprocura porComponentstipos específicos.
pró. Melhor desempenho do que em Approach 1.
vigarista. Subsystemsainda conhece Components.
- 3:
Componentregistra-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. Componentsestão mal associados GameSubsystems.
- 4: Padrão do mediador .
GameState(que contémGameSubsystems) pode implementar registerComponent (Component *).
pró. Componentse GameSubystemsnã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.
Componentsem GameObjectsestá 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.