GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Aplicação do padrão MVC no desenvolvimento de Jogos

Estou estudando sobre desenvolvimento de jogos e a aplicação do padrão MVC.

Já busquei em diversos sites sobre sua implementação e encontrei duas definições bem explicadas, mas diferentes:

Model - contém apenas os dados da entidade (posição, energia, velocidade, etc.) e notifica a View sobre sua mudança de estado

View - desenha o Model na tela de acordo com seu estado

Controller - verifica os inputs do usuário e contém as ações da entidade (pular, atacar, mover, etc.)

(neste caso há pelo menos um Controller para cada Model no projeto e os dados da entidade são separados de suas ações)

Model - contém os dados e as ações da entidade e notifica a View sobre suas mudanças de estado

View - desenha o Model de acordo com seu estado

Controller - verifica os inputs do usuário e avisa o Model

(neste caso tanto os dados como as ações ficam no Model, ele faz os cálculos ao invés do Controller)

Algumas referências da definição 1:

http://obviam.net/index.php/the-mvc-pattern-tutorial-building-games/

“What this all means is, that the models (robots) don’t know anything about how to draw themselves, or how to change their state (position, hit points). They are dumb entities. In Java they are also called POJOs (plain old java objects). The controller is in charge of changing the models state and notify the renderer. The renderer has to have a reference to the models (robots and any other entities) and their state, in order to draw them.”

http://abrindoojogo.com.br/abrindo-o-jogo-shellshock-nam-67

“Imaginemos o conceito de MVC aplicado a um Tanque. Primeiramente ele seria dividido em Entity (Tank), EntityRepresentation (TankRepresentation) e um Controller (TankController). O TankController tem funções como GetAcceleration(), GetSteerDirection(), GetAimTarget() e Fire(). A I.A. guia o tanque usando um TankAIController e o jogador através de TankPlayerController. A classe Tank acompanha o estado físico do veículo, os danos e direção. A TankRepresentation além de desenhar o tanque, cria as partículas de fumaça quando o tanque atira e reproduz um rastro onde o veículo passou.”

http://www.swinburne.edu.au/design/tutorials/P-flash/T-The-Model-View-Controller-Design-Pattern-in-Actionscript-3/ID-144/

“Model Handles data storage and retrieval (eg. Store character x position). View Handles the display/communication (eg. Position character on stage). Controller Handles most the of the application logic (eg. Get current x position)”

http://www.badlogicgames.com/wordpress/?p=2668 (aqui o autor deixa claro que não está usando o MVC “100% puro”)

“The controller(s) are a bunch of classes that reference the model and know how to act on it. E.g. a monster controller might be responsible for moving around a monster in the world, let it seek and attack the hero and so on. Controllers are also responsible for implementing things like the camera following the hero, reacting to user input and so on. All of these things generally update the model but usually do not inform the view of any changes. Either the view can figure out that the model changed, or the model takes note that something changed, which the view can query for.”

Estes são alguns exemplos, claro que há vários tutoriais da definição 2 que dizem que a lógica deve estar no Model e não no Controller, mas essas várias interpretações geram uma certa confusão.

Existe diferença na aplicação do padrão se for para desenvolver um jogo? O que é mais prático, manter a lógica no Model ou aplicá-la no Controller?

Faltou esse aqui:
http://pontov.com.br/site/arquitetura/51-programacao/310-criando-jogos-com-a-arquitetura-mvc

E esse:

Mas sinceramente, não é uma boa arquietura para jogos. Procure por “Component Based Design” e você vai ver que para games há coisa muito melhor. É a arquitetura usada na Unity, por exemplo.

Nicholas Porter, Component Based Architecture

http://gameprogrammingpatterns.com/component.html

[quote=ViniGodoy]Faltou esse aqui:
http://pontov.com.br/site/arquitetura/51-programacao/310-criando-jogos-com-a-arquitetura-mvc

E esse:

Mas sinceramente, não é uma boa arquietura para jogos. Procure por “Component Based Design” e você vai ver que para games há coisa muito melhor. É a arquitetura usada na Unity, por exemplo.

Nicholas Porter, Component Based Architecture

http://gameprogrammingpatterns.com/component.html[/quote]

foi o que imaginei …

No controller sempre vai ter alguma lógica. No model vai depender da complexidade do jogo.

Mas são lógicas diferentes. A lógica do model é relacionado ao domínio da aplicação, enquanto a lógica do controller é relacionada ao papel de coordenar as tarefas entre outros objetos da aplicação.

Agradeço às respostas, me ajudaram bastante.

Realmente o Design baseado em Componentes é uma opção melhor para jogos, vou aplicá-lo nos meus novos projetos.

[quote=ViniGodoy]Faltou esse aqui:
http://pontov.com.br/site/arquitetura/51-programacao/310-criando-jogos-com-a-arquitetura-mvc

E esse:

Mas sinceramente, não é uma boa arquietura para jogos. Procure por “Component Based Design” e você vai ver que para games há coisa muito melhor. É a arquitetura usada na Unity, por exemplo.

Nicholas Porter, Component Based Architecture

http://gameprogrammingpatterns.com/component.html[/quote]

ViniGodoy, com a sua experiencia sabe dizer se é benefico ou malefico usar os padroes GOF em game dev?
vc tem alguma material de referencia?

[quote=JJjava]ViniGodoy, com a sua experiencia sabe dizer se é benefico ou malefico usar os padroes GOF em game dev?
vc tem alguma material de referencia?[/quote]

Não tem nada de errado em usar esses padrões.

A própria arquitetura de componentes é uma versão “extrema” do padrão strategy. É muito comum o uso de Factories, do padrão State, do padrão Flyweight, etc. Há vários livros que falam de padrões de projetos em games, como o Game Coding Complete, C++ For Game Programmers, etc.

http://abrindoojogo.com.br/category/tecnico/projeto-de-software/padrao-de-projeto

Aqui tem alguns exemplos da aplicação dos padrões GOF em jogos, é básico mas dá uma noção.

//