flash on 2009-10-6

by bigfish
♥0 | Line 59 | Modified 2009-10-06 03:56:21 | MIT License
play

ActionScript3 source code

/**
 * Copyright bigfish ( http://wonderfl.net/user/bigfish )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/a1aR
 */

package {
	import flash.events.Event;
	import flash.geom.Matrix3D;
	import flash.geom.PerspectiveProjection;
	import flash.geom.Vector3D;
	import flash.geom.Utils3D;
    import flash.display.Graphics;
    import flash.display.Sprite;

    public class SeaSnake extends Sprite {

		//todo - give fixed length
		private var vertices:Vector.<Number> = Vector.<Number>([]);
		//private var indices:Vector.<int> = Vector.<int>([]);
		private var uvts:Vector.<Number> = Vector.<Number>([]);
		private var numSegs:int = 50;
		private var spine:Vector.<Vector3D> = new Vector.<Vector3D>(numSegs);
		private var segDir:Vector3D ;
		private var segLength:Number = 10;
		private var projMatrix:Matrix3D;
		private var perspective:PerspectiveProjection;
		private var yR:Number = 0;

        public function SeaSnake() {
            
			init();
        }

		/**
		 * construct model of snake
		 */
		private function init():void
		{
			var startPoint:Vector3D = new Vector3D(0, 0, 100);
			//spine point initially is the same as start point
			var spinePoint:Vector3D = startPoint.clone();
			//start with a random vector (in radians)
			//segDir = new Vector3D(Math.random(), Math.random(), Math.random());
			perspective = new PerspectiveProjection();
			projMatrix = perspective.toMatrix3D();

			for(var s:int = 0; s < numSegs; ++s)
			{
				//get next spine point
				//var nextSpinePoint:Vector3D = getNextSpinePoint(spinePoint);

				var newDir:Vector3D = new Vector3D(Math.random()*segLength, Math.random()*segLength, Math.random()*segLength);
				spinePoint = spinePoint.add(newDir);
				trace(spinePoint);
				
				vertices.push(spinePoint.x, spinePoint.y, spinePoint.z);
			}

			/**
			 * getNextSpinePoint - move ahead by fixed length (spineSegLength) in a restricted random motion
			 * (continuing more or less same direction as previous segment)
			 */
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			//render();
		}

		private function onEnterFrame(event:Event):void {
			yR+=0.1;
			if(yR >= 360)
				yR = 0;
			render();
		}

		/**
		 * render - draw spine .. later: flesh out
		 */
		private function render():void
		{
			var vout:Vector.<Number> = new Vector.<Number>();
			projMatrix.prependRotation(yR, new Vector3D(0,1,0));
			//projMatrix.prependTranslation(0,0,100);
			//projMatrix.transformVectors(vertices, vout);
			Utils3D.projectVectors(projMatrix, vertices, vout, new Vector.<Number>());

			var g:Graphics = graphics;
			//draw
			var numVertices:Number = vertices.length/3;
			var commands:Vector.<int> = new Vector.<int>(numVertices/2);
			g.clear();
			g.lineStyle(1,0x000000);
			for(var p:int = 0; p < vout.length -2; p+=3)
			{
				g.lineTo(vout[p], vout[p+1]);
			}
		}
    }
}