Коллизии АС3.0 (самопал) лучше свое самодельное, чем еще лучшее но не мое.

Коллизии лучше разбивать на этапы, сначала примерное попадание, потом точное (или если можно чуть не точное, но поскорее).
ДОКУМЕНТ КЛАСС (это альфа версия), в релиз нужно добавить такую штучку как вектор направления, что-бы при коллизиях вытеснять машину в сторону этого вектора, те. например она дает задний ход и врезается в стену задом и начинает вытесняться на вектор направления и выходит из стены, ну пока этот вектор не реализован, я его поставлю в центр сцены.
package  
{
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;
	
	import lex.*;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class CollizionDoc extends MovieClip
	{
		private var roadFig:Object,
		pointXYArr:Array =[-239,-237,518,-234,492,332,-228,329],
		facArr:Array = [0, 0, 1, 1, 2, 1, 3, 1, 0, 1],
		carPointXYArr:Array =[-13,-17,12,-18,14,15,-18,16],
		lMath:LMath = new LMath,
		carFig:Object,
		wasd:Array,
		moveAng:Number;
		public function CollizionDoc() 
		{
			var i:int;
			roadFig = { pS:[], adr:[], x:0, y:0, r:0, pR:[], cen:new Point };
			carFig = { pS:[], adr:[], x:0, y:0, r:0, pR:[], cen:new Point };
			for (i = 0; i < pointXYArr.length; i+=2) {
				roadFig.pS.push(new Point(pointXYArr[i], pointXYArr[i + 1]));
				roadFig.pR.push(new Point(pointXYArr[i], pointXYArr[i + 1]));
				carFig.pS.push(new Point(carPointXYArr[i], carPointXYArr[i + 1]));
				carFig.pR.push(new Point(carPointXYArr[i], carPointXYArr[i + 1]));
			}
			
			for (i = 0; i < facArr.length; i+=2) {
				roadFig.adr.push(facArr[i]);
				carFig.adr.push(facArr[i]);
			}
			
			for (i = 0; i < carFig.pS.length; i++) {
				carFig.pS[i] = lMath.rotateForCentre(new Point(0, 0), carFig.pS[i], 90);
			}
			
			roadFig.x = 250;
			roadFig.y = 250;
			
			carFig.x = 200;
			carFig.y = 200;
			
			roadFig.r = 0;
			
			graphics.clear();
			showFig(roadFig);
			showFig(carFig);
			moveAng = 0;
			
			new WASDcontroler(wasd = new Array, stage);
			//enterFrameHandler();
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
			//collisionTest();
			
			//stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}

		private function enterFrameHandler(evt:Event = null):void {
			var i:int, m3D:Matrix3D = new Matrix3D, sh:Shape, 
			prePoint:Point,
			finalPoint:Point,
			collizObj:Object;
			//движение
			prePoint = new Point(carFig.x, carFig.y);
			finalPoint = prePoint.clone();
			if (wasd[0] == true) finalPoint.x+=5;
			if (wasd[1] == true) moveAng-=5;
			if (wasd[2] == true) finalPoint.x-=5;
			if (wasd[3] == true) moveAng+=5;
			finalPoint = lMath.rotateForCentre(prePoint, finalPoint, moveAng);
			if (finalPoint.x > 0 && finalPoint.y > 0 &&
			finalPoint.x < stage.stageWidth &&
			finalPoint.y < stage.stageHeight) {
				carFig.x = finalPoint.x;
				carFig.y = finalPoint.y;
			}
			carFig.r = moveAng;
			graphics.clear();
			showFig(roadFig);
			for (i = 0; i < carFig.pS.length; i++) {
				carFig.pR[i] = lMath.rotateForCentre(new Point(0, 0), carFig.pS[i], carFig.r);
				carFig.pR[i].x += carFig.x;
				carFig.pR[i].y += carFig.y;
			}
			
			collizObj = collisionTest();
			carFig.x += collizObj.x;
			carFig.y += collizObj.y;
			
			showFig(carFig);
			//evt.updateAfterEvent();
		}


		private function showFig(_fig:Object):void {
			var i:int, lastPoint:Point,point:Point;
			graphics.lineStyle(1,0xFFFFFF);
			for (i = 0; i < _fig.pS.length; i++) {
				_fig.pR[i] = lMath.rotateForCentre(new Point(0, 0), _fig.pS[i], _fig.r);
				_fig.pR[i].x += _fig.x;
				_fig.pR[i].y += _fig.y;
			}
			
			for (i = 1; i < _fig.adr.length; i++) {
					lastPoint = _fig.pR[_fig.adr[i - 1]];
					point = _fig.pR[_fig.adr[i]];
					graphics.moveTo(lastPoint.x, lastPoint.y);
					graphics.lineTo(point.x, point.y);
			}
		}

		private function showFigRot(_fig:Object, cenRotation:Point):void {
			var i:int, lastPoint:Point,point:Point;
			graphics.lineStyle(1,0xFF8000);
			for (i = 0; i < _fig.pR.length; i++) {
				_fig.pR[i] = lMath.rotateForCentre(cenRotation, _fig.pR[i], _fig.r);
			}
			
			for (i = 1; i < _fig.adr.length; i++) {
					lastPoint = _fig.pR[_fig.adr[i - 1]];
					point = _fig.pR[_fig.adr[i]];
					graphics.moveTo(lastPoint.x, lastPoint.y);
					graphics.lineTo(point.x, point.y);
			}
		}

		private function collisionTest():Object {
			var lp0:Point, lp1:Point, p0:Point, p1:Point, i:int, j:int, 
			colP:Point, distPoint:Point = new Point, carCenPoint:Point = new Point;
			var colDistArr:Array = [];
			var colArr:Array = [];
			var colDistArrF0:Array = [];
			var colDistArrF1:Array = [];
			var minChois:Array = [];
			var returnObj:Object = { ok:false, x:0, y:0 };

			
			for (i = 1; i < roadFig.adr.length; i++) {
				lp0 = roadFig.pR[roadFig.adr[i - 1]];
				lp1 = roadFig.pR[roadFig.adr[i]];
				for (j = 1; j < carFig.adr.length; j++) {
					p0 = new Point(stage.stageWidth/2, stage.stageHeight/2);
					p1 = carFig.pR[carFig.adr[j]];
					//trace(p0, p1, lp0, lp1, ' ');
					//trace(lMath.lineCross(lp0, lp1, p0, p1));
					//if (
					if (lMath.lineCross(lp0, lp1, p0, p1) == true) {
						colP = lMath.lineIntersect(lp0, lp1, p0, p1);
						graphics.drawCircle(colP.x, colP.y, 5);
						colArr.push( { dist:Point.distance(colP, p1), colliz:colP, objPoint:p1 } );
						returnObj.ok = true;
					}
				}
			}
			colArr.sortOn('dist', Array.NUMERIC|Array.DESCENDING);
			//trace(colArr);
			if (colArr.length != 0) {
			//trace('0 ' + colArr[0].dist);
			//if (colArr.length >= 2) trace('1 ' + colArr[1].dist);
			returnObj.x = colArr[0].colliz.x - colArr[0].objPoint.x;
			returnObj.y = colArr[0].colliz.y - colArr[0].objPoint.y;
			}
			return returnObj;
		}

	}
	
}


Тут я еще сделал класс WASDcontroler, он позволяет управлять машинкой при помощи кнопок (догадайтесь каких)
package lex 
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class WASDcontroler 
	{
		public var wasdArr:Array,
		stage:Stage;
		public function WASDcontroler(_wasdArr:Array, _stage:Stage) 
		{
			wasdArr = _wasdArr;
			stage=_stage;
			stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
			stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
		}

		/*---------------------функция реагирования на нажатие клавиш-----------------------------*/
		public function keyDownHandler(evt:KeyboardEvent):void {
			//trace(evt.keyCode);
			//w - 87
			//a - 65
			//s - 83
			//d - 68
			if (evt.keyCode == 87) wasdArr[0] = true;
			if (evt.keyCode == 65) wasdArr[1] = true;
			if (evt.keyCode == 83) wasdArr[2] = true;
			if (evt.keyCode == 68) wasdArr[3] = true;
		}

		public function keyUpHandler(evt:KeyboardEvent):void {
			if (evt.keyCode == 87) wasdArr[0] = false;
			if (evt.keyCode == 65) wasdArr[1] = false;
			if (evt.keyCode == 83) wasdArr[2] = false;
			if (evt.keyCode == 68) wasdArr[3] = false;
		}

	}
	
}

Класс LMath взят с Пересечения прямых.

Тут нужно кликнуть на поле мышкой, а затем нажимать W, A, S, D

Архив самодельной альфа AS3 коллизии.