O paradigma de programação de jogos baseado em componentes está se tornando muito mais popular. Fiquei me perguntando, existem projetos por aí que oferecem uma estrutura de componentes reutilizáveis? Em qualquer idioma, acho que não me importo com isso. Não é para o meu próprio projeto, estou apenas curioso.
Especificamente, quero dizer, existem projetos que incluem uma Entity
classe base , uma Component
classe base e talvez alguns componentes padrão? Seria muito mais fácil começar um jogo se você não quisesse reinventar a roda, ou talvez queira um GraphicsComponent
sprite com o Direct3D, mas você acha que isso já foi feito uma dúzia de vezes.
Uma rápida pesquisa no Google mostra Rusher . Alguém já ouviu falar disso / alguém usa? Se não existem populares, por que não? É muito difícil tornar algo assim reutilizável e eles precisam de personalização pesada? Em minha própria implementação, encontrei muitos clichês que poderiam ser inseridos em uma estrutura.
fonte
Respostas:
Porque não há nada parecido com um consenso sobre como essa estrutura funcionaria.
Em um tópico no Gamedev.net, eu determinei que, quando as pessoas falam sobre sistemas de jogos baseados em componentes, existem pelo menos 8 permutações possíveis de como elas esperam que elas funcionem, com base em 3 fatores diferentes:
Interno x externo - os componentes devem ser agregados a uma entidade ou devem fazer parte de um subsistema e associados apenas ao ID da entidade?
Composição estática versus dinâmica - as entidades devem consistir em um conjunto conhecido de componentes (por exemplo, 1 Física, 1 Animação, 1 AI, etc.) que podem se comunicar em código por meio de interfaces conhecidas ou podem ter quantidades arbitrárias de componentes adicionadas a eles (com estratégias associadas para localizar outros componentes de interesse)
Dados sobre componente vs dados sobre entidade - Os dados devem ser mantidos pelo componente que opera principalmente sobre ele? Ou os dados devem ser armazenados na entidade em um espaço compartilhado, acessível por todos os componentes?
Além disso, há mais perguntas sobre como os componentes devem se comunicar (por meio dos dados compartilhados? Por indicadores de função? Por sinais / slots? Ou não?), Como devem ser atualizados (em uma ordem fixa com base no tipo de componente? A por ordem de entidade definida no momento da criação - com base em um tipo topológico de interdependências de componentes?), etc.
Cada uma dessas opções é completamente arbitrária e tudo o que você pode fazer com um sistema pode ser feito com o outro. Mas a maneira pela qual você precisa codificá-la é bem diferente em cada caso. E as pessoas parecem ter opiniões fortes sobre como funciona melhor para elas.
No momento, as pessoas ainda estão muito envolvidas com a idéia de que os componentes são de alguma forma um substituto para a orientação a objetos (o que não são) e também imaginam que são uma grande mudança em relação à forma como os jogos eram tradicionalmente feitos (que, novamente, não eram) - as pessoas fatoraram os vários subsistemas em suas entidades por idades), então há muita hipérbole e não há muita concordância. Talvez daqui a alguns anos as coisas se acalmem e as pessoas se adaptem a uma ou duas abordagens bastante padrão.
fonte
Há um wiki que está reunindo exemplos de tudo isso:
http://entity-systems.wikidot.com/
... juntamente com explicações das diferenças entre as diferentes abordagens.
fonte
Confira essas estruturas que descobri relacionadas a essa arquitetura ...
www.burgerengine.com
PushButtonEngine
Arthemis Framework - https://github.com/artemis-esf/artemis-framework/tree/master/src/com/artemis
Dando uma olhada na Unity Api. Você pode encontrar muitas coisas relacionadas à arquitetura baseada em componentes. (Atualizarei a lista assim que eu encontrar algo mais ...)
Atualizar:
Isso explica sobre os sistemas de entidades em um bom caminho ... http://piemaster.net/2011/07/entity-component-primer/
fonte
Existe o Push Button Engine for Flash: http://pushbuttonengine.com/
E existe o Panda3D para c ++ / python: panda3d dot com (desculpe, só é permitido 1 URL por post como um n00b)
Tenho certeza de que há muito mais por aí :)
fonte