El código no te lo puedo ni esbozar puesto que hace años que no toco python ni pygame, pero todos los juegos se hacen con la misma base:
Crear objetos
Iniciarlizar objetos
Repetir
actualizar objetos
dibujar objetos
Tienes que tener en cuenta la velocidad a la que se ejecuta el bucle, ya que no es lo mismo que vaya a 30 que a 50 fps, y tú quieres que en ambos casos los sprites se muevan a la misma velocidad. Para ello tienes que medir el tiempo que pasa entre cada actualización y modificar las variables (posiciones, etc) en base a ese tiempo
<Crear e inicializar objetos>
before = tiempo_actual()
Repetir
now = tiempo_actual()
actualizar(now - before)
dibujar()
before = now
Supón que quieres mover un objeto horizontalmente a 20 pixels por segundo. Supón que el tiempo se mide en milisegundos. Tienes la clase objeto con su función update(difftime), que no hace más que modificar la posición horizontal en base al tiempo transcurrido desde la última actualización:
pos_x = pos_x + velocidad * difftime / 1000
Es decir, la nueva posición es la posición actual más la velocidad (en pixels por segundo) por la fracción de segundo. Si difftime es 1/10 de segundo, la posición horizontal varía en 1/10 de velocidad, si se actualiza una vez por segundo (difftime = 1000 milisegundos), varía en velocidad * 1000/1000, es decir, <velocidad> pixels por segundo.
Y así con todo.
En fin, no sé si te he aclarado algo, pero a estas horas no doy más de mí