Existe um padrão geralmente aceito para executar várias ações em um jogo? Uma maneira de um jogador executar ações e também que uma IA possa executar ações, como movimento, ataque, autodestruição etc.
Atualmente, tenho um BaseAction abstrato que usa genéricos do .NET para especificar os diferentes objetos retornados pelas várias ações. Tudo isso é implementado em um padrão semelhante ao Comando, onde cada ação é responsável por si mesma e faz tudo o que precisa.
Meu raciocínio para ser abstrato é para que eu possa ter um único ActionHandler, e a IA pode simplesmente enfileirar ações diferentes implementando a baseAction. E a razão pela qual é genérico é que as diferentes ações podem retornar informações de resultados relevantes para a ação (como ações diferentes podem ter resultados totalmente diferentes no jogo), juntamente com algumas implementações comuns antes da Ação e pós-Ação.
Então ... existe uma maneira mais aceita de fazer isso ou soa bem?
fonte
Respostas:
Eu não acho que há uma maneira aceitável de implementar este conceito, mas eu realmente gostaria de compartilhar como eu geralmente lidar com isso em meus jogos. É um pouco de uma combinação do padrão de design Command e do padrão Composite .
Eu tenho uma classe base abstrata para ações que nada mais é do que um invólucro em torno de um
Update
método chamado cada quadro e umFinished
sinalizador para indicar quando a ação terminou a execução.Também uso o padrão de design composto para criar um tipo de ação capaz de hospedar e executar outras ações. Esta também é uma classe abstrata. Tudo se resume a:
Então, eu tenho duas implementações de ações compostas, uma para execução paralela e outra para execução seqüencial . Mas o mais interessante é que, como paralelo e sequência são ações, elas podem ser combinadas para criar fluxos de execução mais complexos.
E aquele que governa ações seqüenciais.
Com isso, é simplesmente uma questão de criar implementações de ações concretas e usar as ações
Parallel
eSequence
para controlar o fluxo de execução. Vou terminar com um exemplo:Eu usei com sucesso esse sistema para conduzir toda a jogabilidade em uma aventura gráfica antes, mas provavelmente deve funcionar para praticamente qualquer coisa. Também foi simples o suficiente para adicionar outros tipos de ações compostas, que foram usadas para criar loops e condicionais de execução.
fonte
Draw
método já foi criado sobre o estado da entidade e as alterações são automáticas. Em um renderizador de modo retido como o Flash, você pode usar o padrão observável para fazer com que as alterações nas suas entidades se propaguem aos objetos de exibição ou faça a conexão manualmente dentro da própria entidade.Character
classe tenha umaPosition
propriedade e umDraw
método que leia qual é o valor atualPosition
e desenhe a imagem correta. Nessa situação, você só precisa atualizar o valor dePosition
que o resultado será visto automaticamente na tela.Character
tem umaPosition
propriedade, mas delega a renderização para algum tipo deSprite
objeto que está sendo renderizado automaticamente por um gráfico de cena ou algo assim. Nesta situação, você deve garantir que tanto a posição do personagem quanto a do sprite estejam sempre sincronizadas, o que envolve um pouco mais de trabalho. Ainda assim, em ambos os casos, não vejo por que o gerente de ação deveria ter algo a ver com isso. :)