Pensando em um jogo comum, não importa o tipo de jogo, é muito provável que precisemos de algum tipo de câmera. Por exemplo:
- Câmera de depuração: controlada pelo teclado e mouse, com isso somos capazes de nos mover em qualquer lugar da nossa cena.
- Câmera com script: com isso, podemos instruir a câmera a se mover, seguindo um caminho determinado.
- Câmera do jogador.
- ...
Cada um desses tipos de câmera possui sua própria função de atualização. O sistema mais fácil (e ruim) é ter uma classe de gerenciador de câmeras com uma função de atualização genérica e funções especializadas de atualização para cada tipo de câmera. Dentro da função de atualização genérica, temos uma instrução switch que, com base no tipo de câmera, chama a função de atualização adequada.
Em vez disso, pensei em outra abordagem: padrão de estratégia. Movemos o comportamento de cada câmera (método de atualização) em uma classe apropriada que implementa uma interface comum. No gerenciador de câmeras, temos um membro para essa interface e podemos definir dinamicamente qualquer comportamento que desejar.
O que você acha disso? Que outros sistemas você me sugere? Obrigado.
Informações adicionais: existe a possibilidade real de eu precisar de mais de uma câmera ativa, por exemplo, para reflexões. Em suma, devo levar em conta também isso.
fonte
Respostas:
Os padrões de estratégia parecem ser uma boa aposta para mim. Para dar um passo adiante, seu gerente de câmera deve permanecer ignorante quanto aos tipos concretos de câmera. Você registraria e alteraria as implementações de câmera externamente por id (usei uma string para flexibilidade, mas também poderia ser um enum ou int), por exemplo (sem nenhuma verificação de erro):
Editar
Isso é trivial para adicionar. Apenas mude
currentCamera
para:Mude
SetCamera
para ToggleCamera (ou adicione um booleano ao SetCamera, sua escolha):E mude o
Update
método para atualizar todas as câmeras ativas, em vez de apenas a atual:No meu exemplo, você também precisará substituir a
View
propriedade por umGetView
método que tome o ID da câmera como parâmetro. Mas esse é um detalhe que depende da interface da câmera:fonte