in reply to Tracking objects.
I think your way of having an array of objects is pretty reasonable. Any code I've ever written with multiple interacting objects had done just this, and then iterated over the array, doing what needs to be done. This tends to imply a common interface to each object (if they are from different classes), like (slightly facetious) $obj->do_stuff(). do_stuff would change its position, check for physical interactions, change its physical state, you name it.
Someone else commented on the for loop being better written as (0..$_[0]), and that's probably true, but the c-style loop with a more sensible conditional ($i < $_[0], say) is valid.