Система обнаружения столкновений Javascript не игнорирует заблокированные столкновения

У меня возникают проблемы во время разработки мини-игр с использованиемEaselJS с моей системой обнаружения столкновений, и мне нужна чья-то помощь. Проблема возникает, когда герой (круговая карта) сталкивается с объектом, а позади первого находится другой объект, герой сталкивается с обоими объектами, даже если второе столкновение заблокировано. Вот объяснение изображения:

Причина проблемы действительно проста, даже если сама проблема не такова:

Эта система обнаружения столкновений основана на будущем положении круга (а не на его фактическом положении), тогда, если следующее положение круга пересекает прямоугольник, оно отскочит. Проблема в том, что, если будущая позиция пересекает два прямоугольника, круг отскочит в обоих прямоугольниках - даже если фактическое движение круга заблокировано другим прямоугольником и не может достичь второго.

Обновить: Обратите внимание, что эта проблема возникает только тогда, когда стрелка вверх удерживается из-за порядка создания прямоугольника.

Вот соответствующий код JavaScript:

                rects.forEach(function (rect) { // Affect all rects
                    // Collision detection:
                    // (This MUST BE after every change in xvel/yvel)

                    // Next circle position calculation:
                    var nextposx = circle.x + event.delta / 1000 * xvel * 20,
                        nextposy = circle.y + event.delta / 1000 * yvel * 20;

                    // Collision between objects (Rect and Circle):
                    if (nextposy + height(circle) > rect.y &&
                        nextposx + width(circle) > rect.x &&
                        nextposx < rect.x + rect.width &&
                        nextposy < rect.y + rect.height) {
                        if (circle.y + height(circle) < rect.y) {
                            cls("top");
                        }
                        if (circle.x + width(circle) < rect.x) {
                            cls("left");
                        }
                        if (circle.x > rect.x + rect.width) {
                            cls("right");
                        }
                        if (circle.y > rect.y + rect.height) {
                            cls("bottom");
                        }
                    }

                    // Stage collision:
                    if (nextposy < 0) { // Collided with TOP of stage. Trust me.
                        cls("bottom"); // Inverted collision side is proposital!
                    }
                    if (nextposx < 0) {
                        cls("right");
                    }
                    if (nextposx + width(circle) > stage.canvas.width) {
                        cls("left");
                    }
                    if (nextposy + height(circle) > stage.canvas.height) {
                        cls("top");
                    }
                });

JSFiddle

Ответы на вопрос(2)

Ваш ответ на вопрос