Because everything is stored in global lists, the values can be both accessed and changed by other sprites. By having each bullet run through each enemy, the distance formula can be used to determine whether each enemy is close enough to each bullet to be considered colliding. With this in mind, the enemy behavior can be entirely coded in the enemy sprite, so I moved the spawning of bullets there.