por rcaf » Mar May 08, 2007 10:20 pm
Una frase muy escuchada y usada en el paradigma del diseño de algoritmos es:
Divide y vencerás
Es decir, debemos tratar de dividir nuestro problema, en problemas más pequeños, y la solución de cada uno de estos "problemitas" puede ser escrita en una función. Por lo tanto tendrás muchas pequeñas funciones que en su conjunto, y la comunicación entre ellas resuelven el problema inicial.
Esto es aplicable a la construcción de cualquier software y por supuesto de videojuegos también.
Ahora bien, la mayoría de los programas medianamente grandes vienen separados en varios archivos, ya que aplican esta técnica.
Por ejemplo, supongamos que estamos haciendo un videojuego tipo Pong, sabemos que los objetos que están presentes en un juego como este son dos raquetas (paddles) y una pelota (ball). Estos objetos interactúan dentro de una cancha, que para efectos prácticos simplemente puede ser un fondo, ya que no existirán colisiones entre paddles/ball y la cancha.
¿Cómo solucionar este problema?
Bueno, si vamos a usar programación estructurada y con módulos, como comente anteriormente en el otro post, tendremos que crear un módulo para manejar las raquetas, otro para la pelota y otro para la cancha.
Por cada uno de estos módulos, tendremos dos archivos: el header (*.h) y el código fuente de las funciones (*.c).
Por ejemplo para manejar una raqueta tendremos:
paddle.c
paddle.h
En el archivo paddle.h existirán los prototipos de las funciones, tipos de datos nuevos definidos por el programador, definición de estructuras (struct), constantes (#define, const), etc.
El archivo paddle.c hará un include de paddle.h y contendrá el código de cada una de las funciones definidas en paddle.h
Imaginemos que ya hicimos lo mismo para ball (ball.c, ball.h) y para la cancha (cancha.c cancha.h)
Por último tendremos otro archivo llamado main.c
En el encontraremos varios includes a los archivos .h de los módulos definidos anteriormente y la funcion main() propiamente tal. Dentro de la función main llamaremos a la funciones ya definidas.
Claramente esto es solo un ejemplo, faltan más módulos. De hecho debería existir un modulo para manejar todo lo relacionado con los gráficos (puede llamarse grafico.c / grafico.h), donde estarán las funciones para inicializar modos de video, cargar imagenes y dibujarlas en pantalla, etc. También debería existir un módulo que maneje colisiones, otro que se dedique a mostrar información en la pantalla, como puntaje, tiempo, etc.
Por ejemplo en el juego de plataformas que estás construyendo podrías tener un módulo para manejar mapas, otro para manejar colisiones, para el personaje, etc.
Si estas usando Allegro o SDL o cualquier otra API, estos módulos ya estarían hechos, así que bastaría solo con hacer un include de estas bibliotecas en los archivos que las necesitan. Pero aun así es posible crear tu propio módulo para manejar video, eventos del teclado/mouse, timers, audio, fuentes, etc y dentro de estas llamar a las funciones nativas de cada API.
Básicamente de esta forma se pueden estructurar los juegos y cualquier tipo de programa. Si usáramos POO, en el .h iría la definición de la clase, y en el .cpp el contenido de cada uno de los métodos de dicha clase.
Ahora compilar varios archivos es otro tema, pero básicamente consiste en compilar cada uno de los archivos .c o .cpp por separado y luego linkearlos todos junto a las bibliotecas externas que estés usando, como por ejemplo Allegro, SDL, etc.
Si usas una IDE y creas un proyecto, esto se simplifica ya que la compilación y linkeo se hará automáticamente y obtendrás finalmente el ejecutable.
Desconozco si estás programando en windows, linux u otro SO, así que las herramientas y el compilador pueden ser diferentes.
Cuando bajas un código fuente de un programa/juego, normalmente trae un archivo makefile que tiene todas las reglas para poder compilar su código, en su defecto podría también traer un archivo de proyecto de alguna IDE conocida, por lo que su compilación no tendría ningun problema.
Espero que te haya quedado un poco más claro como estructurar un programa en varios archivos.
Cualquier duda que tengas acá estaremos para ayudarte.
S2!