Saludos, para mí la estructura está bien. Si estás utilizando
ANSI C (y no C++) tal vez te sirva seguir un estilo de programación
que se denomina "modularizada". La idea consiste en crear
estructuras que representen los elementos de tu juego (un disparo,
un personaje...) y un conjunto de funciones que te permita
manipularlas.
La ventana principal de esta forma de escribir programas en C
se observa en la claridad de transmite el código, te facilita hacer
cambios en cualquier momento y es consistente. Por ejemplo,
en este caso, yo crearía un módulo "Disparo" y funciones que
tengan nombres como "disparo_crear",
"disparo_detectar_colisiones" ... etc. Cada una de estas funciones
recibe como primer parámetro un disparo. Te dejo un pequeño
programa de ejemplo, ten en cuenta que lo escribí directamente
en el foro: solo es ilustrativo (no compila, ni funciona). Solo te
será útil para observar en que consisten los módulos:
- Código: Seleccionar todo
/*
* Representa un disparo que puede eliminar enemigos
*/
typedef struct disparo_t
{
int x;
int y;
SDL_Surface * image;
int velocity;
} Disparo;
/*
* Genera un modulo Disparo y le asigna propiedades iniciales.
*/
Disparo * disparo_crear(int x, int x, int velocity)
{
Disparo * nuevo = (Disparo *) malloc(sizeof(Disparo));
nuevo->x = x;
nuevo->y = y;
nuevo->image = SDL_LoadBMP("disparo.bmp");
nuevo->velocity = velocity;
return nuevo;
}
/*
* Dibuja el disparo sobre una superficie.
*/
void disparo_draw(Disparo * data, SDL_surface * screen)
{
SDL_Rect destino = {data->x, data->y, 0, 0};
SDL_BlitSurface(data->image, NULL, screen, &destino);
}
/*
* Actualiza la posición del disparo y verifica colisiones con los enemigos.
*/
void disparo_update(Disparo * data, Enemigo * enemigos, int cantidad_enemigos)
{
int i;
data->y -= data->velocidad;
/* verifica colisiones con todos los enemigos.
* si se presenta una colision hace 'explotar' al enemigo y desaparece
* al disparo. */
for (i=0; i<cantidad_enemigos; i++)
{
if (disparo_colisiona_con(data, enemigos[i]))
{
enemigo_explotar(enemigos[i]);
disparo_desaparecer(data);
return;
}
}
}
/*
* Programa de prueba (sin terminar, solo ilustrativo).
*
* Genera 5 enemigos y un solo disparo.
*/
int main(void)
{
Disparo * d1 = NULL;
Enemigo * enemigos[5];
int i;
/* [...] codigo que define el modo de video en `screen` */
/* genera un disparo que "debería" colisionar con alguna nave. */
d1 = disparo_crear(60, 200, -1);
/* genera 5 enemigos alineados en y=30, separados por 40 pixeles en x */
for (i=0, i<5; i++)
enemigos[i] = enemigo_crear(40 * i, 30)
/* Bucle del programa */
while (! salir)
{
/* actualización de elementos de juego */
disparo_update(d1, enemigos, 5);
for (i=0, i<5; i++)
enemigo_update(enemigos[i]);
/* actualización de la pantalla */
disparo_draw(d1, screen)
for (i=0, i<5; i++)
enemigo_draw(enemigos[i], screen);
}
/* libera memoria de los modulos */
disparo_free(d1);
for (i=0; i>5; i++)
enemigo_free(enemigos[i]);
return 0;
}
Si quieres un ejemplo de módulos que funciona, podrías descargar
el juego "pocket volleyball", ese juego usa módulos para cada
elemento del juego:
http://www.losersjuegos.com.ar/juegos/v ... eyball.php
Saludos.