In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 粘土に顔埋めた感じの

画像読んで、RチャンネルをピクセルのZに使う。
/**
 * Copyright DLabz ( http://wonderfl.net/user/DLabz )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/uhRk
 */

// forked from whirlpower's 粘土に顔埋めた感じの
package 
{
	import flash.geom.Matrix;
	
	/*
		画像読んで、RチャンネルをピクセルのZに使う。
	*/
	import flash.display.*;
	import flash.events.*;
	import flash.net.URLRequest;
	import flash.system.*;
	import flash.net.*;	
	
	
	[SWF(width=465, height=465, frameRate=60, backgroundColor=0x222222)]
	
	public class Main extends Sprite 
	{
		// loader
		private var url			:String = "http://assets.wonderfl.net/images/related_images/8/80/80e0/80e07aa704555dd97cd1cf645a102c23e3735906";
		private var bitmapData	:BitmapData;
		private var loader		:Loader;
		
		// particle
		public var particles:Array = [];
		public var renderer	:Renderer;
		
		public function Main():void 
		{
			loader = new Loader();
			loader.contentLoaderInfo.addEventListener( Event.COMPLETE, complateHandler );
			loader.load( new URLRequest(url), new LoaderContext(true) );
		}
		
		private function complateHandler(e:Event):void
		{
			loader.contentLoaderInfo.removeEventListener( Event.COMPLETE, complateHandler );
			bitmapData = e.target.content.bitmapData;
			
			addChild( new Bitmap( bitmapData ) );			
			
			var color	:int = 0;
			var xx		:int = 0;
			var yy		:int = 0;
			var w		:int = bitmapData.width;
			var h		:int = bitmapData.height;
			var s		:int = 6;	
			
			for( yy	= 0; yy < h; yy++ ) 
			{
				for ( xx = 0; xx < w; xx++ )
				{
					color = bitmapData.getPixel( xx, yy );
					var red		:int = (color >> 16) & 0xff;  
					var green	:int = (color >> 8) & 0xff;  
					var blue	:int = (color >> 0) & 0xff;
					var px		:Number = ( xx * s ) - ( w / 2 * s );
					var py		:Number = ( yy * s ) - ( h / 2 * s );
					
					if ( red > 1 )
					{
						var particle:Particle = new Particle( px, py, int(red/2) );
						particles.push( particle );
					}
				}
			}
			
			// レンダリングスクリーン
			var sw:int = stage.stageWidth;
			var sh:int = stage.stageHeight;
			renderer = new Renderer( sw, sh, particles );
			addChild( renderer );
			
			stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouse );
			stage.addEventListener( MouseEvent.MOUSE_UP,   onMouse );
			addEventListener(Event.ENTER_FRAME, onEnterFrame );
		}
		
		private function onMouse( e:MouseEvent ):void
		{
			if( e.type == "mouseDown" )mouseDown = true; 
			if( e.type == "mouseUp" )mouseDown = false;
		}
			
		private var vx			:Number	= 1;
		private var vy			:Number = 0;
		private var lx			:Number	= 0;
		private var ly			:Number = 0;
		private var friction		:Number = 0.999;
		private var mouseDown	:Boolean = false;
		
		private function onEnterFrame( evt:Event ):void
		{
			// 横回転
			if ( mouseDown )
				vx = lx - stage.mouseX;
			else
				vx *= friction;
			if( Math.abs( vx ) <= 0.1 ) vx = 0;
			lx = stage.mouseX;
			
			// 縦回転
			if( mouseDown )
				vy = ly - stage.mouseY;
			else
				vy *= friction;
			if( Math.abs( vy ) <= 0.1 ) vy = 0;
			ly = stage.mouseY;
			
			// 座標回転
			for each( var particle:Particle in particles )
			{			
				rocalRotate( particle, "z", "y",  vy );
				rocalRotate( particle, "x", "z", -vx );
			}
			
			renderer.draw();
		}
		
		private function rocalRotate( particle:Particle, a:String, b:String, v:Number ):void
		{
			var cos	:Number;
			var sin	:Number;
			var posA:Number;
			var posB:Number;
			var rad	:Number = Math.PI / 360;
			
			cos	 = Math.cos( v * rad );
			sin	 = Math.sin( v * rad );
			posA = particle[a];
			posB = particle[b];
			particle[a] = posA * cos - posB * sin;
			particle[b] = posB * cos + posA * sin;
		}		
	}
}

	internal class Particle
	{
		public var x	:Number = 0;
		public var y	:Number = 0;
		public var z	:Number = 0;
		
		public function Particle( x:Number=0, y:Number=0, z:Number=0 ):void
		{
			this.x = x;
			this.y = y;
			this.z = z;			
		}
	}
	
	import flash.display.*;
	
	internal class Renderer extends Bitmap
	{
		private var w			:int = 0;
		private var h			:int = 0;
		private var particles	:Array;
		
		// 3D
		public var vpX	:int	= 0;
		public var vpY	:int	= 0;
		public var fl	:uint	= 500;
		
		public function Renderer( _w:int, _h:int, particles:Array ):void
		{
			w = _w;
			h = _h;
			
			this.particles = particles;
			bitmapData	= new BitmapData( w, h, true, 0x00 );
			
			vpX	= int( w/2 );
			vpY	= int( h/2 );
			fl	= 500;
		}
		
		public function draw():void
		{
			var scale	:Number;
			var viewX	:int;
			var viewY	:int;
			var color	:uint;	
			var c1		:int;
			
			bitmapData.lock();
			bitmapData.fillRect( bitmapData.rect, 0x00 );
			
			for each( var p:Particle in particles )
			{
				scale = fl / ( fl + p.z );
				viewX = vpX + p.x * scale;
				viewY = vpY + p.y * scale;
				
				c1 = 255 - ( ( p.z + 50) / 100 * 255 );
				c1 = c1 < 0? 0:c1;
				c1 = c1 > 255? 255:c1; 
				color = 0xff000000 | c1 << 16 | c1 << 8 | c1;
				
				 bitmapData.setPixel32( viewX, viewY, color );
				
			}
			bitmapData.unlock();
		}
	}