Que filosofia de código / estrutura de abstração / design de programa permitiria que um jogo fosse usado com gráficos 2D e 3D (separadamente) SEM ter que recodificar a lógica do jogo?
Estamos falando de usar o mesmo código, alterar um mínimo de coisas (por exemplo, trocar nomes de arquivos por recursos 2D com nomes de arquivos por recursos 3D) e talvez conectar algumas especializações de uma classe base por genéricos / modelos.
Para colocá-lo em um contexto real, onde faz sentido: imagine um jogo para vários jogadores da LAN, onde há um cliente 3D de alto nível e sedento de desempenho para os jogadores com algumas plataformas gamer realmente boas e um cliente 2D mais humilde para os antigos caixas empoeiradas que alguém encontrou no sótão. Mas ainda é o mesmo jogo - os mesmos eventos são registrados (alguém pegou uma moeda), o mesmo protocolo de rede é usado, os mundos são proporcionais etc.
Para colocá-lo em um contexto MVC: Os controladores são exatamente os mesmos (pressionar a tecla "Para cima" definirá a aceleração dos jogadores em 3,5 unidades / segundo), as vistas são totalmente diferentes (2D versus 3D) e o modelo é o mesmo exceto por qualquer coisa diretamente relacionada aos gráficos (uma verificação de colisão no ambiente é realizada a cada 5 segundos e usa o mesmo algoritmo. Observe que isso significa que existe uma coordenada Z para todos os objetos do jogo na versão 2D, mas é apenas ignorado ou exibido para o usuário de outra maneira, por exemplo, por uma sombra que é exibida mais à esquerda quando o jogador está no ar).
O que torna esse tópico tão fascinante é que forçaria o desenvolvedor a ter uma idéia muito clara de como seus dados estão estruturados e de como o controle flui. Observe que isso não implica o uso de outra coisa senão uma biblioteca de gráficos como SDL, D3DX ou OpenGL. Não há motores de jogos!
Como essa é uma questão principalmente teórica, deixarei de fora as linguagens de programação, mas se você quiser dar um exemplo, poderá usar qualquer linguagem que desejar, C ++, se quiser fazer o trabalho todo, ou mesmo Brainfuck, se sentir até o desafio (todas as respostas concretas serão apreciadas, bem como as abstratas!).