Bueno, antes de todo te voy a hacer una recomendacion, no te lo tomes a mal xD
Procura escribir un codigo mas claro, me explico, el codigo que has escrito se entiende, pero cuesta lo suyo entenderlo y es un tanto complicado de leer. Recuerda que tienes que hacer codigo que cualquier programador pueda entender. Pero vamos esto se gana trabajando en cualquier proyecto de open source en el cual te pegaran la bronca, en el buen sentido, por escribir un codigo dificil de leer (esto me paso a mi xDD)
Bueno vamos a tu problema:
Creo haber entendido como funciona tu programa y el error del disparo es un error simple, pero que por culpa de todas las variables que hay en uso se hace un caos.
El problema es que tienes dos variables (balax y balay) estas variables son las encargadas de la posicion de la bala que luego son pasadas al rectangulo. Tienes varias cosas en el codigo que sobran pero vamos, primero que funcione y luego lo demas.
Bueno el problema que creo que tiene tu programa es que estas variables que deberian variar segun la posicion del coche(he entendido yo del programa) permanecen invariables durante todo el programa y esto es lo que hace que la bala salga siempre del mismo sitio, ya que se usan estas variables para designar el origen del disparo.
La solucion=> Debes hacer que estas variables varien segun la posicion del automovil. Por lo tanto cada vez que hagas un disparo debes hacer
y esto creo yo deberia solucionar el problema.
PD: Un consejo, ademas de hacer el codigo claro, en el game loop yo creo que es mas claro si se hace en este orden
Código C:
Ver originalgameloop
{
eventos();
logica();
render();
}
No tienes porque hacerlo asi, el orden da lo mismo, pero yo creo que queda mucho mas claro, pero vamos.
Saludos.