Puedes escribir un motor de juego en prácticamente cualquier idioma usando prácticamente cualquier método de renderizado. Podría escribir un motor de juego en bash usando la salida de la consola, por ejemplo.
Entonces, creo que sería mejor definir qué es exactamente lo que quieres aprender al escribir tu propio motor. Hay muchos "campos" en el desarrollo de juegos.
etc. Desde allí puedes incluso tener subtemas. En Renderizado / Gráficos
¡Solo uno de esos subtemas podría consumir muchas horas (o años) de estudio!
Entonces, primero define lo que quieres aprender. Comience simple.
Use cualquier idioma con el que se sienta cómodo, aunque algunos son más adecuados para ciertas tareas. Por ejemplo, el motor central y la representación probablemente se realicen mejor con un lenguaje de nivel "inferior" como C / C ++ (si necesita rendimiento, eso es); pero algo como IA o Reglas de juego podría hacerse mejor en un lenguaje de nivel superior. Nada dice que no puedes mezclar y combinar. Puede escribir su motor en C ++, su renderizado en C (ya que funciona bien con OpenGL) y luego usar LUA para escribir sus Reglas de juego, etc.
Como ejemplo, hay un motor de juego llamado Slick2D. Está escrito en Java y es de código abierto. Es un ejemplo de un motor 2D simple escrito y diseñado realmente bien. Puedes aprender conceptos básicos a partir de eso, como bucles de juego, administrar estados de juego, etc.
Si te sientes cómodo con C / C ++; Sugeriría echar un vistazo a SDL / OpenGL. Maneja parte de la limpieza como entrada, sonido, creación de ventanas, etc. y puede enfocarse en otras cosas.