Does that sound like a reasonable approach or am I missing something?
Seems reasonable to me. You may take care, however, that you don't make unuseful checks or loops, which will slow down the program.
Let's make an example using the game Asteroids. The number of shots are always less than the number of asteroids, that's why a loop like:
for each shot
check collision with all asteroids
next
would be far better than this:
for each asteroids
check collision with all shots
next
Of course the number of iterations remains the same, but the first loop has the avantage that when there are no shots, the loop will not be executed.
The same concept may be applied to your mobs, props and shots. Start the loop first with the collection that contains less objects. If there are less mobs than props, then loop through the mobs. If there are less shots than mobs, then start to loop through the shots. And so on.
Further more, if you run out of pfs - that is, if you notice a slow down caused by the nested loops, you can exit from the loop at each collision, like:
collided = false
for each shot
for each props
if shot collides with props
'do something
collided = true
Return 'this exits the current function
endif
next
next
Hope this has sense for you,
Sergio.