Read through it. I did not find out, why balls can escape out of the room.
You used time.clock()  I use time.time() to get my starttime from. Both is more accurate than using the normal timerfunction. Guess the only difference is this: On Windows, time.clock() has microsecond granularity but time.time()'s granularity is 1/60th of a second; on Unix, time.clock() has 1/100th of a second granularity and time.time() is much more precise.
vizmat.ReflectionVector: great that this seems to be built in. Is there any doc available how you do it? Guess you kind of transform the coordinate system, so the normal vector is (e.g) the y axis of the new system. Then you figure out, how the incoming vector is defined in this new coordinate system and change (multiply with 1) the coordinate that is similar to the y (normal vector / axis of coordinate system2). Then you have the new direction and transform it back to the normal coordinate system. (Maybe there is an easier / better way, this is just how I would do it).
So I did not find the reason, why balls jump out. It could be, that if there are too many balls, the loop is just not fast enought to fire off an intersectionevent and so the ball flies through. If this is the case we would have to adjust waittime if ther were too much balls  or what do you think about balls escaping?
Thank you for helping me, I learned a lot,
Johannes
P.S. I did not find out yet, why it did not work with the old example but I will see (in case you have an idea?, but don't bother I will anyway mail again, if I run into problems matching the two files)
