Estou com um dilema sobre como certos componentes do mecanismo - como câmera e interface do usuário - sabem quem seguir, cuja saúde e outros atributos devem ser exibidos na tela.
Como você arquiteta um sistema em que ocorre a comunicação entre esses componentes e as entidades? Eu poderia ter uma entidade separada que representa o jogador, mas isso parece um pouco "codificado". E se eu quiser mover a câmera? E se o jogador começar a controlar outra entidade?
Em outras palavras, como abstraio as fontes de dados de componentes como a câmera e a interface do usuário, para que eles não se importem com a entidade que representam?
Um sistema de eventos funciona em muitos casos, mas é mais adequado para propagar informações que mudam ou são geradas 'raramente' (como a morte do jogador). Para algo como integridade e posição da entidade - que precisa ser conhecida em todos os quadros - um sistema de eventos não é adequado.
fonte
Respostas:
A solução mais simples seria manter um ponteiro de membro para um objeto como Camera.Target ou UI.Subject que aponta para o personagem do jogador, mas pode ser redirecionado para outros objetos (ou definido como NULL) quando necessário.
Se o jogador mudar de personagem, envie um evento para alterar a variável alvo da câmera e o assunto da interface do usuário. Se você deseja deslocar a câmera, substitua o comportamento "alvo" e defina-o para um movimento manual.
fonte
ITarget
interface que basicamente define variáveis X / Y (meu jogo é 2D). MeusPlayer
classe implementa esta interface e atualiza os valores com as suas coordenadas X / Y e, em seguida, oCamera
tem umaTarget
propriedade do tipoITarget
. CadaUpdate
, asCamera
verificações, se tiver umTarget
e-se em conformidade atualizações, caso contrário ele faz outra coisa (no meu caso, é gratuito e se move com base em teclas pressionadas, mas você pode fazer o que quiser).Acho que a maneira mais fácil de fazer isso é simplesmente não me restringir a ter apenas uma câmera.
Em vez disso, meus mundos de jogo estão cheios de câmeras, dezenas ou centenas delas. Qualquer personagem potencialmente controlável possui uma câmera, qualquer cena possui uma câmera, geralmente uma única entidade também possui várias câmeras para diferentes atividades do jogador. (movimentos de combate, marcha lenta, corrida, etc). Cada câmera recebe seu alvo quando é criada, e esse alvo (como regra geral) permanece constante durante toda a vida útil da câmera.
O problema agora não é "como a câmera sabe qual personagem está seguindo", mas "como o renderizador sabe qual das câmeras na cena que ele realmente deveria estar usando para renderizar agora". Eu uso uma classe de gerenciador de câmeras para isso, que conhece todas as câmeras da cena e pode se misturar de uma para outra, conforme instruído pelos eventos que recebe da lógica do jogo.
fonte
Os jogadores provavelmente são diferentes o suficiente de outros objetos ou entidades para terem sua própria classe. Para muitos jogos, é perfeitamente legítimo ter um objeto de jogador global que pode estar disponível em todo o mecanismo e sempre representa o jogador, e qualquer sistema que precise saber sobre o jogador pode conversar com essa classe. Isso pode ser mais limpo e simples do que passar por um ponteiro em qualquer lugar.
Se o seu jogo for multiplayer em uma rede, isso ainda fará sentido, porque há uma grande diferença entre o jogador local e o remoto. Se você suporta o multiplayer local com dois controladores, precisará de vários objetos de jogador e passagem de ponteiro concomitante.
fonte