>>787
"Only one action when event loops"を消してみましょう。
この条件があることで、連続して実行されるべきイベントが1回に抑制されているので
foreachで回している意味が無くなってしまっています。
外す事で、オブジェクトが障害物から抜けることは無くなったと思います。
しかし、そうすると片方の壁の付近で反転を繰り返すようになったと思います。
これは、「オブジェクトと衝突」の条件は、トップに置いてないと1回だけの衝突と判定されないためです。
2番目以降にあった場合「オブジェクトと重なっている時」と同じ判定になってしまいます。
しかしforeachもトップに置かなければいけない条件のために
動作が反転しても即壁に重なったと判定されて繰り返し動作に陥ってしまっています。
フレーム1の衝突判定用オブジェクトは、ぶつかると即反対位置に移るため、
重なりっ放しにならないのでちゃんと動作していたんですね。

結論としては、判定オブジェクトは惜しまずに必要なだけ用意する、ということですね。