Ainda sou verde para os sistemas de entidade / componente. Acho que, como tenho componentes úteis para desenhar sprites (ou planilhas) e manipular as entradas (cliques do mouse / toque), naturalmente quero reutilizá-las para criar componentes da interface do usuário (como botões, por exemplo, tela de seleção de nível).
Isso me parece muito estranho. Eu sempre entendi as entidades como "modelo de jogo", como jogadores, inimigos, power-ups, etc. Por outro lado, de uma perspectiva de reutilização de código, reutilizar componentes para a interface do usuário faz todo o sentido.
Como (e onde) as preocupações de interface do usuário / GUI se encaixam em um sistema de entidade / componente?
(Nota: esta pergunta é independente de plataforma, pois se aplica a várias plataformas / idiomas)
fonte
Respostas:
Depois de usar vários sistemas de componentes de entidades, especialmente o CraftyJS, obtive mais ou menos a resposta para minha pergunta: sim, você pode reutilizar componentes (especialmente sprites ou imagens e manipuladores de cliques do mouse em jogos 2D) para a GUI.
Na maioria das vezes, você só tem acesso ao ECS, e não aos sistemas subjacentes (por exemplo, sistema de desenho). Nesse caso, não há problema em usar componentes, pois você não tem outra escolha.
Se você tiver acesso ao sistema subjacente (por exemplo, Ruby roguelike com acesso direto a Curses), poderá achar que desenhar / renderizar diretamente nesse sistema é mais eficaz (menos código, menos frágil, mais natural) do que usar vários entidades e componentes.
fonte
Em 2D ou 3D, um sistema de componente de entidade (ECS) deve ter pelo menos acesso ao sistema da GUI, se não fizer parte do mesmo ECS.
Pessoalmente, eu não misturaria os dois. A reutilização do código para uma GUI realmente acontece apenas no nível superior. Respondendo ao mouse / teclado, renderização e assim por diante. As funções que diferentes botões executam ou as informações exibidas por determinadas listas não são realmente algo que possa ser tornado genérico o suficiente para ser reutilizado.
Por exemplo, eu imaginaria que os componentes para entidades da GUI seriam algo como
position
,render
egui
. Onde o componente da GUI definiria o tipo de ação que a entidade da GUI executa. No entanto, essa ação será única e específica ao contexto. Isso resulta no sistema que lida com os componentes da GUI ser muito grande e essencialmente projetado para lidar com cada uma das funções da GUI (carregar o jogo, salvar o jogo, encontrar o servidor, etc.). Parece bagunçado.Eu preferiria criar um arquivo de classe padrão para cada "tela" da GUI. Tenha todas as funcionalidades dessa tela em um só lugar (com referências a uma classe de funcionalidade comum). É muito mais limpo e fácil de gerenciar.
No entanto, como eu disse, o ECS deve ter acesso ao sistema GUI. Ele precisa fornecer informações à GUI com base nas entidades em seus sistemas. Por exemplo, passar o mouse sobre uma unidade aliada abriria uma janela da GUI com todas as informações sobre essa unidade. Onde pairar sobre uma unidade inimiga apareceria uma janela da GUI com informações limitadas. Você provavelmente não deseja programar a GUI para saber a diferença entre os dois; você deseja solicitar à entidade que exiba suas informações.
Portanto, é provável que as entidades ainda tenham algum tipo de componente da GUI, mas estarão entidades "em jogo", não entidades da GUI. Este componente usará o sistema GUI externo para criar sua interface GUI.
fonte
TouchButton
que são compostas por uma planilha e um ouvinte de toque e clique. Para o pop-up da unidade, eu provavelmente implementaria isso como uma combinação de componente sprite + componente ouvinte do mouse. Hmm.