¿Qué filosofía de código / estructura de abstracción / diseño de programa permitiría utilizar un juego con gráficos 2D y 3D (por separado) SIN tener que volver a codificar la lógica del juego?
Estamos hablando de tomar el mismo código, cambiar un mínimo de cosas (por ejemplo, intercambiar nombres de archivos por activos 2D con nombres de archivos por activos 3D), y tal vez conectar algunas especializaciones de una clase base por genéricos / plantillas.
Para ponerlo en un contexto real en el que tiene sentido: imagine un juego LAN multijugador en el que hay un cliente 3D de primer nivel y ávido de rendimiento para los jugadores con algunas plataformas de juego realmente buenas, y un cliente 2D más humilde para los viejos cajas polvorientas que alguien encontró en su ático. Pero sigue siendo el mismo juego: se registran los mismos eventos (alguien recogió una moneda), se usa el mismo protocolo de red, los mundos son proporcionales, etc.
Para ponerlo en un contexto MVC: los Controladores son exactamente iguales (presionar la tecla "Arriba" establecerá la aceleración de los jugadores en 3.5 unidades / segundo), las Vistas son totalmente diferentes (2D versus 3D), y el Modelo es el mismo a excepción de cualquier cosa directamente relacionada con los gráficos (se realiza una verificación de colisión para el entorno cada 5 segundos, y utiliza el mismo algoritmo. Tenga en cuenta que esto significaría que hay una coordenada Z para todos los objetos del juego en la versión 2D, pero es simplemente ignorado o mostrado al usuario de otra manera, por ejemplo, por una sombra que se muestra más a la izquierda cuando el jugador está en el aire).
Lo que hace que este tema sea tan fascinante es que FORZARÍA al desarrollador a tener una idea muy clara de cómo se estructuran sus datos y cómo fluye el control. Tenga en cuenta que esto no implica usar otra cosa que no sea una biblioteca de gráficos como SDL, D3DX u OpenGL. No hay motores de juego!
Dado que esta es una pregunta mayormente teórica, dejaré los lenguajes de programación, pero si quieres dar un ejemplo, puedes usar el lenguaje que quieras, C ++ si quieres ir a por completo, o incluso Brainfuck si sientes a la altura del desafío (¡Cualquier respuesta concreta será apreciada, así como cualquier respuesta abstracta!).