Minha pergunta é esta:
Como alguém armazenaria dados de contexto global, ou seja. informações de dados mundiais, hora mundial atual, etc. em um sistema de componente de entidade?
Penso em trabalhar para criar um jogo de simulação de mundo aberto em estilo Dwarf Fortress em C ++. Criei um mecanismo de jogo no estilo de componente de entidade apenas por diversão e atualmente estou tentando descobrir como vou trabalhar em todos os recursos que eu quero. Além do jogo padrão (renderização, física, dados de componentes específicos da entidade, etc.), eu também gostaria de ter alguns dados contextuais globais aos quais todos os sistemas relevantes teriam acesso (ou seja, os dados mundiais como em que ano atualmente é , se o aquecimento global está acontecendo, qualquer coisa que seja relevante para simular um mundo). Eu pensava originalmente em criar um componente "mundial", mas isso parece inútil e difícil se muitos sistemas diferentes precisarem acessar esses dados logicamente "globais".
Faria sentido ter um componente "mundo" ou devo armazenar esses dados de outra maneira?
Também pensei em simplesmente tornar esses dados globais, dando acesso a qualquer sistema que desejasse usá-los; parece uma violação dos princípios de componente de entidade em geral, e talvez confuso por outras razões, mas achei que poderia realmente funcionar.
A outra coisa em que pensei seria realmente incorporar dados relevantes do contexto mundial diretamente nos próprios sistemas. Por exemplo, se eu tivesse um AgeSystem
"envelhecido" todas as entidades que têm um getsWeakerAsTimePasses
componente ou outros enfeites, talvez esse sistema possa armazenar dados de tempo relevantes para o mundo diretamente como dados de membros que ele usaria para calcular a passagem do tempo e quanto idade e enfraquecer as pessoas, etc. Essa terceira opção era minha menos favorita, mas algo que me ocorreu no brainstorming.
Alguém pode aconselhar?
fonte
Respostas:
Qualquer maneira que funcione é uma maneira que funcione. Isso parece ridículo, mas, na verdade, seu jogo é 1000x mais importante que sua arquitetura. Escolha qualquer abordagem que desejar e seja fácil de usar.
Os que eu já vi em jogos reais de remessa (usando design baseado em componentes, não o ECS especificamente; nunca vi o ECS puro "in natura", embora muitos designs de componentes tenham elementos semelhantes ao ECS) incluem:
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
, sim, realmente)Todos eles trabalham. Eu tenho queixas com algumas abordagens e um favorito óbvio, mas todas elas foram usadas para enviar jogos AAA. Às vezes, várias abordagens em um único projeto (mais de 40 a 100 equipes de engenheiros tendem a criar código duplicado aleatório, infelizmente).
fonte