Existem estruturas baseadas em componentes do FOSS existentes? [fechadas]


25

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 Entityclasse base , uma Componentclasse 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 GraphicsComponentsprite 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.


4
Você deve ser o primeiro a escrever um! :)
Ricket

11
Bem, eu escrevi um em C # para o meu próprio projeto. Talvez todos nós possamos contribuir?
Tesserex 28/10/10

Eu estaria totalmente disposto a trabalhar nesse projeto C #. Sim, não existe um consenso enorme sobre como um padrão deve funcionar, mas talvez possamos nos concentrar no XNA (o que quer que flutue no seu barco). Só porque um monte de gigantes não declarou a melhor maneira de fazer isso não significa que não podemos tentar / experimentar.
Michael Coleman

Talvez porque o design baseado em componentes atrai gerentes de projeto mais de programadores
M. Utku Altinkaya

Respostas:


45

Se não existem populares, por que não?

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.


11
Aprecio que essa resposta seja antiga, mas agora está errada: existem estruturas populares e resta muito pouco debate sobre o assunto. Ao escrever jogos, a maioria das perguntas acima não importa: elas não têm efeito no design do código ou uma abordagem é rápida e reutilizável, enquanto as outras não. Na prática, existem várias estruturas populares - o wiki vinculado a uma das outras respostas é um bom ponto de partida (muitos de nós a mantemos para facilitar a localização de jogos e estruturas reais)
Adam

11
@ Adam: Eu gostaria de um link sobre os detalhes sobre a abordagem que venceu a partida de darwin evolution na época. quando digo detalhes, não quero ouvir sobre o interior e o exterior, quero saber sobre mapas de hash, vetores, alocadores, privado, público, loops, const ... Detalhes de baixo nível.
v.oddou

@ v.oddou alguém postou um link para o wiki como resposta já (veja abaixo). Você quer detalhes? Está cheio de código fonte .
Adam

10

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.


Ash e Artemis (ambos no wiki) provaram ser realmente populares, ambos usados ​​no desenvolvimento de jogos comerciais, junto com o desenvolvimento de jogos de hobby.
Adam

4

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:

      https://code.google.com/p/spartanframework/

Isso explica sobre os sistemas de entidades em um bom caminho ... http://piemaster.net/2011/07/entity-component-primer/


2

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í :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.