Дорога для флеш игрули.

Если вы мыслите непродвинуто, то вы нарисуете дорогу для игрули. Однако, игруля будет 3Д и это мне мыслится так, дорога будет состоять из плит, конечно, можно нарисовать каждую плиту в отдельности (весить будет много, будет очень красиво), можно сделать путь в виде последовательности гладких и не-гладких точек и задать дороге ширину (весить будет до неприличия мало, внешний вид оставляет желать лучшего, делать очень легко и можно менять ширину дороги) выбираем второй вариант, т.к. он мне нравится больше чем первый. Нафига здались эти плиты??? ну так, нужно ведь не загромождать трехмерное пространство и процессор и отображать только видимые куски дорожных плит, а остальные нафик и может тогда сбудется коварный план о глобальном лимите граней в 300 граней самых видимых граней остальные вообще не показывать.
документ класс
package  
{
	import flash.display.Sprite;
	import data.*;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class Doc extends Sprite
	{
		private var readStartXml:ReadStartXml;
		public function Doc() 
		{
			x = y = 250;
			readStartXml = new ReadStartXml;
			readStartXml.showPoint(graphics);
		}
		
	}
	
}

Класс для математической работы LMath.
package lex 
{
	import flash.geom.*;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class LMath 
	{
		
		public function LMath() 
		{
			
		}
		
		public function bezier3(p0:int,p1:int,p2:int,t:Number):Number {
			return (1-t)*(1-t)*p0+2*t*(1-t)*p1+t*t*p2;
		}

		public function returnRotation(point1:Point, point2:Point):Number {
			var myX:int, myY:int;
			myX = point1.x - point2.x;
			myY = point1.y - point2.y
			return 90 - Math.atan2(myX, myY) * 180 / Math.PI;
		}

		public function rotateForCentre(centr:Point, point:Point, angel:Number):Point {
			var m3D:Matrix3D = new Matrix3D();
			m3D.appendRotation(angel, new Vector3D( 0, 0, 1));
			var myPivotPoint:Vector3D = new Vector3D( centr.x, centr.y, 0);
			var pointVec:Vector3D = new Vector3D(point.x, point.y, 0);
			pointVec.decrementBy(myPivotPoint);//вычитание векторов
			
			pointVec=m3D.transformVector(pointVec);//ротация
			
			pointVec.incrementBy(myPivotPoint);//сложение векторов
			return new Point(pointVec.x, pointVec.y);
		}

	}
	
}

Класс рисователь дороги, вы ж понимаете, что это альфа демка, а дальше будет новый уровень, где не пройдя предыдущие будет сильно непонятна суть происходящего.
package data 
{
	import flash.display.Graphics;
	import flash.geom.*;
	
	import lex.LMath;
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class ReadStartXml 
	{
		private var startXml:StartData,
		pXml:XMLList,
		fXml:XMLList,
		pArr:Array,
		pObj:Object,
		lMath:LMath;
		public function ReadStartXml() 
		{
			var i:int;
			startXml = new StartData;
			pXml = startXml.xml.point.p;
			fXml = startXml.xml.fac.idType;
			trace(fXml);
			pArr = [];
			pObj = new Object;
			for (i = 0; i < pXml.length(); i ++) {
				pObj[pXml[i].name] = {x:pXml[i].x, y:pXml[i].y } ;
			}
			lMath = new LMath;
		}

		public function showPoint(gr:Graphics):void {
			var i:int;
			var t:int;
			var color:uint = 0x000000;
			var pointBesierArr:Array = [];
			var fixedPointArr:Array = [];
			var p:Point;
			var lastPoint:Point;
			var step:Number;
			var dist:Number;
			var previusPoint:Point;
			var nextPoint:Point;
			var rot:Number;
			var ansPoint:Point;
			var upLineArr:Array = [];
			var downLineArr:Array = [];
			
			gr.lineStyle(0);
			for (i = 0; i < pXml.length(); i++) {
				if (pXml[i].type == 2) color = 0x80FF80; else color = 0x0;
				gr.beginFill(color);
				gr.drawCircle(pXml[i].x, pXml[i].y, 3);
				gr.endFill();
			}
			gr.moveTo(pXml[fXml[0].id].x, pXml[fXml[0].id].y);
			
			for (i = 0; i < fXml.length(); i +=2) {
				//trace(fXml[i].id);
				//trace('pArr.length ' + pArr.length);
				if (i != 0) {
					gr.curveTo(pObj[fXml[i - 1].id].x, pObj[fXml[i - 1].id].y, pObj[fXml[i].id].x, pObj[fXml[i].id].y);
					for (t = 0; t < 100; t++) {
						pointBesierArr.push(p = new Point(
						lMath.bezier3(pObj[fXml[i-2].id].x, pObj[fXml[i-1].id].x, pObj[fXml[i].id].x, t / 100),
						lMath.bezier3(pObj[fXml[i-2].id].y, pObj[fXml[i-1].id].y, pObj[fXml[i].id].y, t / 100)
						));
						//gr.drawCircle(p.x,p.y,10);//неотсортированные кружечки
					}
				}
			}
			//в массиве pointBesierArr содержатся точки с разным расстоянием междуними
			//Выборка последовательности точек с примерно одинаковыми расстояниями между точками
			step = 30;
			lastPoint = pointBesierArr[0];
			for (i = 1; i < pointBesierArr.length; i++) {
				p = pointBesierArr[i];
				dist = Point.distance(lastPoint, p);
				if (dist >= step) {
					fixedPointArr.push(p);
					lastPoint = p;
					//gr.drawCircle(p.x,p.y,10);//отсортированные кружечки
				}
			}
			for (i = 0; i < fixedPointArr.length; i++) {
				p = fixedPointArr[i];
				if (i == 0) previusPoint = fixedPointArr[fixedPointArr.length - 1];
				else previusPoint = fixedPointArr[i - 1];
				
				if (i == fixedPointArr.length - 1) nextPoint = fixedPointArr[0];
				else nextPoint = fixedPointArr[i + 1];
				
				gr.moveTo(p.x, p.y);
				//gr.lineTo(p.x + 20, p.y);
				rot = lMath.returnRotation(nextPoint, previusPoint);
				ansPoint = lMath.rotateForCentre(p, new Point(p.x, p.y + 20), rot);
				upLineArr[i] = ansPoint;
				gr.lineTo(ansPoint.x , ansPoint.y);
				ansPoint = lMath.rotateForCentre(p, new Point(p.x, p.y - 20), rot);
				downLineArr[i] = ansPoint;
				gr.moveTo(p.x, p.y);
				gr.lineTo(ansPoint.x , ansPoint.y);
			}
			
			//внутреннее кольцо

			for (i = 0; i < upLineArr.length; i++) {
				gr.moveTo(upLineArr[i].x, upLineArr[i].y);
				if (i != upLineArr.length - 1) gr.lineTo(upLineArr[i + 1].x, upLineArr[i + 1].y);
				else gr.lineTo(upLineArr[0].x, upLineArr[0].y);
			}
			
			//наружное кольцо
			for (i = 0; i < downLineArr.length; i++) {
				gr.moveTo(downLineArr[i].x, downLineArr[i].y);
				if (i != downLineArr.length - 1) gr.lineTo(downLineArr[i + 1].x, downLineArr[i + 1].y);
				else gr.lineTo(downLineArr[0].x, downLineArr[0].y);
			}

		}
	}
	
}


И собственно путь у меня такой
package data
{
	
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class StartData 
	{
		public var xml:XML;
		public function StartData() 
		{
			xml =<doc>
  <point>
    <p>
      <name>0</name>
      <x>-221</x>
      <y>17</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>1</name>
      <x>11</x>
      <y>-182</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>2</name>
      <x>92</x>
      <y>37</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>3</name>
      <x>190</x>
      <y>126</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>5</name>
      <x>-193</x>
      <y>-170</y>
      <type>2</type>
      <show>1</show>
    </p>
    <p>
      <name>6</name>
      <x>163</x>
      <y>-189</y>
      <type>2</type>
      <show>1</show>
    </p>
    <p>
      <name>7</name>
      <x>75</x>
      <y>125</y>
      <type>2</type>
      <show>1</show>
    </p>
    <p>
      <name>8</name>
      <x>152</x>
      <y>263</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>9</name>
      <x>278</x>
      <y>129</y>
      <type>2</type>
      <show>1</show>
    </p>
    <p>
      <name>11</name>
      <x>-83</x>
      <y>270</y>
      <type>1</type>
      <show>1</show>
    </p>
    <p>
      <name>12</name>
      <x>71</x>
      <y>335</y>
      <type>2</type>
      <show>1</show>
    </p>
    <p>
      <name>10</name>
      <x>-230</x>
      <y>188</y>
      <type>2</type>
      <show>1</show>
    </p>
  </point>
  <fac>
    <id>0</id>
    <idType>
      <id>0</id>
      <type>1</type>
    </idType>
    <idType>
      <id>5</id>
      <type>2</type>
    </idType>
    <idType>
      <id>1</id>
      <type>1</type>
    </idType>
    <idType>
      <id>6</id>
      <type>2</type>
    </idType>
    <idType>
      <id>2</id>
      <type>1</type>
    </idType>
    <idType>
      <id>7</id>
      <type>2</type>
    </idType>
    <idType>
      <id>3</id>
      <type>1</type>
    </idType>
    <idType>
      <id>9</id>
      <type>2</type>
    </idType>
    <idType>
      <id>8</id>
      <type>1</type>
    </idType>
    <idType>
      <id>12</id>
      <type>2</type>
    </idType>
    <idType>
      <id>11</id>
      <type>1</type>
    </idType>
    <idType>
      <id>10</id>
      <type>2</type>
    </idType>
    <idType>
      <id>0</id>
      <type>1</type>
    </idType>
  </fac>
</doc>
		}
		
	}
	
}


Архив плиточной дороги.