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.