Доброго времени суток, форумчане.
Есть 2-х мерная аркадная покатушка. Точки проверки столкновений будут располагаться на всех автомобилях подобным образом.

Сам алгоритм движения и проверки столкновений на данный момент таков(двигается не сам автомобиль, а фон):

Код AS3:
public function Movement(event:Event):void{
var pos_x,pos_y:int;
var fpn,bpn,rpn,lpn:int; //Счетчики точек отталкивания
if ((Up == true) && (speed >=(-maxspeed))){speed -= power;} //Если нажата кнопка вперед
if ((Down == true) && (speed <=(maxspeed/5))) {speed += power; }//Если нажата кнопка назад
if ((Left == true) && (Math.abs(speed) >=1 )) //Если нажата кнопка влево
if (speed<0) car_test.rotation -= angle
else if (speed>0) car_test.rotation += angle;
if ((Right == true) && (Math.abs(speed) >=1 )) //Если нажата кнопка вправо
if (speed<0) car_test.rotation += angle
else if (speed>0) car_test.rotation -= angle;
/*Проверка передних точек*/
for (fpn=0;fpn<3;fpn++){
var _forward:Point = new Point(car_test['fp'+fpn].x,car_test['fp'+fpn].y);
var _forwardG:Point = new Point();
_forwardG = car_test.localToGlobal(_forward);
if (map_c.wall.hitTestPoint(_forwardG.x,_forwardG.y,true)){
if (Math.abs(speed)<5) speed *= (-1)
else {
speed = (speed/2)*(-1);
trace('/4');
}
break;
}
}
/*Проверка задних точек*/
for (bpn=0;bpn<3;bpn++){
var _back:Point = new Point(car_test['bp'+bpn].x,car_test['bp'+bpn].y);
var _backG:Point = new Point();
_backG = car_test.localToGlobal(_back);
if (map_c.wall.hitTestPoint(_backG.x,_backG.y,true)){
if (Math.abs(speed)<5) speed *= (-1)
else {
speed = (speed/2)*(-1);
}
break;
}
}
/*Проверка точек справа*/
for (rpn=0;rpn<3;rpn++){
var _turnR:Point = new Point(car_test['rp'+rpn].x,car_test['rp'+rpn].y);
var _turnRG:Point = new Point();
_turnRG = car_test.localToGlobal(_turnR);
if (map_c.wall.hitTestPoint(_turnRG.x,_turnRG.y,true)){
if ((speed<0) && (Math.abs(speed)>1)) car_test.rotation -= angle*2;
else if (speed>0) car_test.rotation += angle*2;
break;
}
}
/*Проверка точек слева*/
for (lpn=0;lpn<3;lpn++){
var _turnL:Point = new Point(car_test['lp'+lpn].x,car_test['lp'+lpn].y);
var _turnLG:Point = new Point();
_turnLG = car_test.localToGlobal(_turnL);
if (map_c.wall.hitTestPoint(_turnLG.x,_turnLG.y,true)){
if ((speed<0) && (Math.abs(speed)>1)) car_test.rotation += angle*2;
else if ((speed>0) && (Math.abs(speed)>1)) car_test.rotation -= angle*2;
break;
}
}
speed *= friction;//Добавление трения
/*Нахождение следующей точки положения автомобиля*/
pos_x = speed*Math.cos(car_test.rotation * Math.PI/180);
pos_y = speed*Math.sin(car_test.rotation * Math.PI/180);
map_c.x -= pos_x;
map_c.y -= pos_y;
map_s.x -= pos_x;
map_s.y -= pos_y;
map_p.x -= pos_x;
map_p.y -= pos_y;
}
Проблема в том, что как я не переставлял точки проверки столкновений, и как не правил значения переменных, всё-равно удается воспроизвести ошибку "застревания в непроходимый объектах".

Проблема явно случается при одновременном соприкосновении торцовой и боковой точки с непроходимым объектом.
Подскажите как можно было бы с этим бороться.
PS: Игра достаточно проста, чтобы не использовать продвинутые физ. движки.