Cuando haces un include el precompilador copia el código del include y lo pega al archivo donde se llamo al include.
Así como lo estás pensando esta bien, tienes un archivo engine.h en el llamas a audio.h, graficos.h, etc. en engine.h podrás usar todo las funciones que tengas en esos archivos y supongamos que engine.h es incluido en el archivo game.h en el archivo game.h podras hacer uso de las funciones de engine.h y de todas la bibliotecas que ya incluiste, por lo que esto puede causar problemas por que el compilador no dejará que definas dos veces una función o clase, para eso se usan las directivas del precompilador.
en todos los include que tengas pones los siguiente. (por ejemplo el archivo audio.h)
#ifndef AUDIO_H
#define AUDIO_H
tu código
#endif
a cada archivo le pones un define que tu quieras así evitas duplicar definiciones.
y por ultimo eso de los namespace no sirve para esto, los namespace sirven para evitar que los nombres de funciones o clases se repitan un ejemplo burdo: supón que creas una función que se llame cout para imprimir un texto en tu juego pero claro dependiendo de las mañas de cada programador pone al principio
- Código: Seleccionar todo
use namespace std
esto puede crear un conflicto de nombres(suponiendo que el compilador detectó una ambigüedad que le impidió sobrecargar las funciones).
La manera de resolverlo es que tu declares un espacio de nombres que contenga esa función, de hecho lo recomendable es declarar un espacio de nombres para todo tu engine.
El conocimiento de unos es conocimiento de todos.