Como codificar UI / HUD no Sistema de entidades?

18

Acho que já tive a idéia do Sistema de Entidades inspirada em Adam Martin (máquina t). Quero começar a usar isso no meu próximo projeto.

Eu já conheço o básico de Entidade, Componentes e Sistemas. Meu problema é como lidar com UI / HUD. Por exemplo, uma janela de missão, janela de habilidades, janela de informações sobre personagens, etc. Como você lida com eventos da interface do usuário (por exemplo, pressionando um botão)? São coisas que não precisam ser processadas a cada quadro. Atualmente, estou usando o MVC para codificar a interface do usuário, mas não acho que seja compatível com o Sistema de entidades.

Eu li que o Sistema de entidades está incorporado em um OOP maior. Não sei se a interface do usuário está fora do ES ou não. Como abordar este?

Sylpheed
fonte

Respostas:

17

Talvez você esteja pensando demais em sistemas de entidades. Entidades destinam-se a escopo de objetos no jogo, como personagens, inimigos, scripts, marcadores, gatilhos, etc.

Talvez se você separar sua interface do usuário, será muito melhor e mais fácil. Você não precisa fazer TUDO dentro do escopo das entidades.

Gustavo Maciel
fonte
Isso também é o que Adam Martin diz em uma de suas postagens ou comentários na t-machine. O ES é uma solução para um problema específico. Ele pode e deve ser usado junto com soluções mais 'tradicionais' para outros aspectos do jogo (mecanismo).
user8363
Obrigado. Só não tenho certeza do que deve haver no ES. Então, como você codifica uma interface do usuário eficaz? Acho que o MVC não resolve porque estou tendo problemas com a hierarquia.
Sylpheed
Vejo que você concorda em usar uma arquitetura diferente para a interface do usuário. Então, qual é o problema com o MVC?
Narek
O @Armen MVC não tem problemas, mas colocá-lo dentro do escopo das entidades. Só que seus benefícios não superam suas desvantagens. Não há necessidade de ser um Arquitetura Astronaut
Gustavo Maciel
3

Embora eu ache que uma interface do usuário de entidade / componente possa funcionar, seria difícil fazê-lo. Além disso, está longe o suficiente dos componentes e sistemas que você teria para processar suas entidades do jogo; seria basicamente apenas outro sistema de entidade / componente dentro do seu jogo. Não consigo imaginar que houvesse muita sobreposição entre os dois.

Os sistemas de entidades são impressionantes e pode ser tentador usá-los em qualquer lugar. Afinal, quando você adquire um martelo realmente doce, fica tentado a tratar todos os seus problemas como unhas. No entanto, o sistema EC é apenas mais uma ferramenta na sua bolsa de programação. Para os problemas usados ​​para resolvê-lo, funciona muito bem, mas você tem ferramentas melhores para problemas como a interface do usuário.

A estrutura de herança funciona muito bem para GUIs. Não apenas para criar os componentes da interface do usuário, mas também para organizá-los. É realmente bom poder ter componentes de interface do usuário filhos de outros componentes para que eles possam herdar propriedades como posição, escala e opacidade. Se você tentasse configurar isso com um sistema EC, teria que quebrar algumas regras do sistema EC.

MichaelHouse
fonte
1

Você pode criar uma nova função de interface chamada sempre que UI / HUD for desenhada e permitir que componentes personalizados / com script implementem essa função. Isso requer um sistema IMGUI (existem muitos tutoriais no Google, essa é apenas a apresentação original) para ser usado. Com isso, você pode criar janelas como entidades nas quais terá seu próprio componente de criação de interface do usuário e um componente de renderizador de quadro de janela.

Quanto a não processar tudo isso a cada quadro, você pode renderizar toda a interface do usuário para um buffer diferente, que será atualizado apenas em todos os tipos de eventos de entrada / dados. Ou seja, sempre que um evento é recebido, ele altera alguma variável para indicar que a janela precisa ser redesenhada no próximo quadro. Se essa variável for verdadeira, ela será definida como falsa e as interfaces da interface do usuário serão chamadas depois disso. Se você deseja animações, é importante usar essa ordem exata de operações para que a própria interface do usuário possa acionar uma nova pintura para o próximo quadro.

snake5
fonte