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?
fonte
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.
fonte
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.
fonte