Pergunta

Say você está construindo um jogo de Tetris. Como qualquer programador adequada, você tem a sua visão lógica de um lado, e sua lógica de negócios do outro lado; provavelmente, um full-on MVC acontecendo.

Quando o modelo envia seu update(), a visão redesenha próprio, como esperado.

Mas então ... se você quiser adicionar, digamos, uma animação para desaparecer uma linha, como você implementar que, na opinião?

fazer suposições que você quer --- com exceção de que "tudo está devidamente encapsulado".

Foi útil?

Solução

Pessoalmente, gostaria de separar chamar a tela o mais rápido possível, mesmo se não houvesse atualização da posição do bloco. Assim, gostaria de ter um lugar loop com um "update" e "render" parte. Atualização joga a bola para a lógica que faz ou não faz qualquer atualização de posições e / ou remoção de bloco. Tornar peças a bola para a parte gráfica, que atrai os blocos onde deveriam estar.

Agora, se há linhas para apagar, a lógica sabe e pode marcar as linhas a ser removido. Eu assumo aqui, que cada peça é composto por 4 blocos individuais e qualquer um destes blocos é um único objeto. Agora, quando este bloco tem a "morrer" set -flag, você pode tomar algumas tornam-peças para desaparecer do bloco (digamos, 500ms para explodir). Após este tempo, o objecto pode ser eliminado e o bloco de uma linha acima cai para baixo. Por 500ms? Bem, você definitivamente deve usar movimento com base no tempo , pois isso mantém a velocidade do jogo o mesmo em computadores diferentes.

Btw, já existem os chamados motores de jogo que fornecem tal-render-loop de atualização. Por exemplo XNA, se você vai a linha NET. Você também pode codificar o seu próprio motor, mas cuidado, não é uma tarefa fácil e é muito demorado. Eu fiz isso uma vez e não esperava que fosse um motor como a Source Engine; -)

Outras dicas

A maioria dos jogos executar um loop que constantemente redesenha a vista do jogo o mais rápido possível, em vez de esperar por uma mudança no estado do modelo e, em seguida, atualizar a visualização.

Se você gosta do padrão de vista do modelo, em seguida, ele pode funcionar bem para a vista para continuar a desenhar alguns tipos de objetos depois de serem removidos do modelo, desvanecendo-los ao longo de alguns milissegundos.

Outra abordagem seria combinar classe MVC com algo como a execução diferencial - a 'visão' é um modelo do que é apresentado, mas o código de desenho compara o fluxo de eventos do 'view' cria com o fluxo da prestação anterior . Então, se em um fluxo que há uma linha, eo próximo não existe, o código de desenho pode animar a diferença. Isso permite que o desenho a ser captada longe da vista. Freqüentemente a 'visão' no MVC é uma coleção de widgets, ao invés de ser algo que atrai a exibição diretamente, de modo que você acabar com MVC aninhada hierarquias de qualquer maneira: a aplicação é MVC (modelo de dados, visualizar objetos, controlador app), onde o vista objeto tem uma coleção de widgets cada um dos quais é MVC (estado do widget (por exemplo, o botão pressionado), look and feel / ligação toolkit, mapeamento de eventos kit de ferramentas -> estado do widget).

Muitas vezes me perguntei isso mesmo.

Os meus próprios pensamentos têm sido ao longo desta linha:

1) A vista é dado o estado dos blocos (forma, bla-bla), mas com dados extra "transição":

2) o facto de uma linha tem de ser removida é codificado no estado, NÃO calculado no modo de exibição.

3) A visão sabe como desenhar transições agora:

  • Nenhuma mudança: Estado é o mesmo para este determinado bloco
  • Mudança de "cair" para "bloqueado": estado está "travado" (por um bloco de queda)
  • Mudança de "fechado" para "remover": estado é "removido" (por uma conclusão linha)
  • Mudança de "cair" para "remover": estado é "removido", mas velho estado foi "caindo"

É interessante pensar em um jogo como MVC. Isso é uma perspectiva que eu nunca tomadas (por alguma estranha razão), mas definitivamente uma um intrigante que faz muito sentido. Supondo que você implementar o seu jogo Tetris com um MVC, eu acho que há duas coisas que você pode querer ter em conta no que diz respeito à comunicação entre o controlador e o seu ponto de vista: Não estado, e existem eventos.

Seu controlador é, obviamente, o ponto central de interação para o usuário. Quando emitir comandos do teclado, o controlador irá interpretá-los, e fazer os ajustes estaduais apropriadas. No entanto, às vezes o jogo vai entrar em um estado que coincide com um evento especial ... como o preenchimento de uma linha com blocos que agora deve ser removida.

Scoregraphic lhe deu uma grande fundação. Sua visão deve operar em um ciclo fixo para manter a velocidade consistente em computadores. Mas, além de atualizar a tela para prestar novo estado, ele também deve ter uma fila de eventos que ele pode executar animações em resposta a. No caso das linhas de enchimento em Tetris, o controlador poderia emitir objetos de evento rigidez que derivam de algum tipo de tipo de evento de base para a fila de vista evento, que poderia, então, ser usado pela visão para executar respostas animaram a apropriados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top