Estou usando C # / XNA e me disseram várias vezes para não misturar código de atualização com código de desenho - e tenho certeza de que não! Mas alguém poderia descrever o que exatamente é 'código lógico'?
Como visto aqui: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] certifique-se de colocar toda a sua lógica de jogo dentro do método Update (não no Draw!) e tudo funcionará a uma velocidade constante.
Estou perguntando isso, pois a velocidade do meu jogo está flutuando em relação ao FPS. FPS lento é igual a objetos em movimento lento e vice-versa. E sim, estou incluindo o position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
código esperado .
Esta é provavelmente uma grande pergunta de novato, mas eu só quero ser absolutamente claro sobre a definição disso.
fonte
position = speed * ...TotalSeconds
. Observe que=
não é+=
. Se fosse+=
exatamente como você digitou, sua posição sairia da tela quase instantaneamente.gt.ElapsedGameTime.TotalSeconds
era o número de segundos decorridos desde o início do programa (jogo). Se você estiver multiplicando sua velocidade por isso, após 5 segundos de jogo, sua velocidade será 5 vezes mais rápida (exceto no caso especial em que a velocidade está definida como 0). Não tenho certeza do que mais você poderia ter que tornaria isso falso, mas estou intrigado.iii
que incremento manualmente cada atualização, porque não a quero em segundos, quero etapas ou quadros. Eu posso ver que o seu caminho é uma maneira válida de codificação suave.Respostas:
Isso muda o estado do seu mundo de jogo? É um código lógico.
Ele exibe o estado do mundo do jogo? Está renderizando código.
fonte
Sua separação está correta se:
fonte
Draw()
pode desenhar figuras diferentes com o passar do tempo. Por exemplo, os quadros de sprites animados podem continuar mudando. Além disso, os objetos podem continuar visualmente avançando se o código de renderização usar um truque comum e aumentarvelocity * time since last update / period of update
a posição visível dos objetos (enquanto sua posição real permanecer inalterada).iff
significando se e somente se?Update
está entendendo, o que mais está saindo de sincronia? Entradas do player perdidas, eventos de rede não sendo processados, etc.? O jogo deve ser acionado por um único relógio, com "ticks" fixos para lógica ou física do jogo derivados desse relógio, e o estado dos gráficos derivados também acionados pelo mesmo relógio.Draw()
dessa maneira, para que sempre desenhe a mesma imagem quando chamado várias vezes seguidas. Deve-se fazer isso, se possível. Mas há casos em que você não sabe com que frequênciaDraw()
será chamada. Por exemplo, se você deseja suporte total (120 FPS reais) para novos monitores de 120 hz e ativar o vsync.What if I want to pause graphics?
Então você passa 0 em vez do tempo delta real para oDraw()
.0
. Você pode ter relógios hierárquicos, por exemplo, a interface do usuário ainda é executada e animada, enquanto a interpolação de caracteres é interrompida com muita facilidade.O ponto aqui é a separação das coisas do modelo que não são o modelo.
A lógica do jogo é o modelo conforme mencionado em
Todos esses são padrões de arquitetura de software relacionados e diferentes. Mas, em todos os casos, o Modelo é a mesma coisa: é a lógica real e o estado real.
É o momento em que o software de negócios é chamado de lógica de negócios e codifica algumas das políticas de negócios. Por exemplo, se você está codificando algo para um banco, para calcular faturas de cartão de crédito, a funcionalidade de fazer com que alguém não precise pagar juros se liquidar sua dívida em menos de 30 dias faz parte da lógica de negócios, ela vive no modelo. Por exemplo, ele não fica em uma das camadas exibidas. O código para imprimir uma fatura, por exemplo, não edita o texto com base em suas ações. Este exemplo talvez destaca por que você pode querer organizar seu código dessa maneira.
O mesmo vale para a lógica do jogo.
Imagine que em algum momento seu jogo foi portado para outro console. Pode ajudar a imaginar algo realmente diferente do seu objetivo atual. Por exemplo, se você está alvejando algo com um gamepad / controlador, imagine que seu jogo seja portado para um tablet com tela sensível ao toque. A lógica do jogo é a parte do código que não muda quando você o move.
Se seu jogo era algo parecido com um jogo de estratégia militar, imagine que ele foi convertido no jogo de tabuleiro mais complexo do mundo. A lógica do jogo são as seções do código que correspondem diretamente às linhas do livro de regras. (Nem todas as linhas do livro de regras, nem aquelas sobre peças em movimento, mas algumas.).
A lógica do jogo é o que nunca muda, independentemente da forma.
fonte