forked from: Stage3D test 2

by s8t1h12akj forked from Stage3D test 2 (diff: 2)
@mxmlc -swf-version 21
♥0 | Line 151 | Modified 2016-07-19 15:49:04 | MIT License
play

ActionScript3 source code

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

// forked from WLAD's Stage3D test 2
/// @mxmlc -swf-version 21
package 
{
	import flash.display.Sprite;
	import flash.geom.Point;
	import flash.geom.Vector3D;
	import flash.text.TextField;
	import flash.ui.Keyboard;
	
	[SWF(width='465', height='465')]
	public class WFL_oucy6 extends Sprite
	{
		private var sw:int, sh:int;
		public function WFL_oucy6()
		{
			stage.color = 0;
			graphics.beginFill(0); graphics.drawRect(0, 0, 3000, 3000);
			var text:TextField = new TextField(); text.autoSize = 'left'; 
			text.textColor = 0x9A9A9A; stage.addChild(text);
			text.scaleX = text.scaleY = 1.2; text.mouseEnabled = false;
			text.text = "画面左/右 マウス2回クリックで 大小画面と回転が変わります".toUpperCase(); 
			
			var sw:int = stage.stageWidth;
			var sh:int = stage.stageHeight;
			
			var space:Space3D = new Space3D();
			space.addParent( this, sw >> 1, sh >> 1 );
			
			var layers:int = 8;
			var mid_index:Number = (layers - 1) / 2;
			var padding:int = 25;
			C.SIZE = 10;
			C.ALPHA = 0.3;
			var layerCount:int;
			
			var pi2:Number = Math.PI * 2;
			
			for (var z:int = 1; z < layers; z++) {	
				
				layerCount = z == 0 ? 1 : ( z * 6 );
				
				var rDelta:Number = pi2 / layerCount;
				
				var rMax:Number = pi2 - rDelta / 2;
				
				var rDist:Number = (layers-z) * padding;
				
				for (var r:Number = 0; r < rMax; r += rDelta ) 
				{	
					var color:uint;
					if ( z == layers - 1 ) color = HSV2HEX(r*57.2957, 1, 1);
					else {
						var cVal:Number = z / layers;
						color = HSV2HEX( cVal*170+80,1,1);
					}
					
					var circle:C = new C( color );
					
					var p:Point = Point.polar( rDist, r );
					
					space.position( 
						circle, 
						p.x, 
						p.y, 
						(( layers - z ) - mid_index) * padding
					);
				}
			}
			
			// camera vars
			var rotation_speed:Number = 7;
			var rotation_speed_init:Number = 0;
			space.rotate( 0, 4 );
			
			// Enter frame 
			stage.addEventListener('enterFrame', function(e:*):void
			{
				space.rotate(0, 0, (7 - 14 * stage.mouseX / sw) + rotation_speed_init );
				
				//space.display.rotationY = isFS ? -4 : 7;
				text.visible = !isFS;
			});
			
			// Mouse click
			stage.addEventListener('click', function(e:*):void
			{
				space.rotate( 180, 0, 0 );
			});
			
			// Right click 
			stage.addEventListener('rightMouseDown', function(_:*):void
			{rotation_speed_init = rotation_speed_init == 0 ? 60 : 0; });
			
			// Fullscreen
			var isFS:Boolean = false;
			stage.doubleClickEnabled = true;
			stage.addEventListener('doubleClick', function(e:*):void {
				isFS = stage.displayState == 'normal';
				if ( isFS ) stage.displayState = 'fullScreen';
				else stage.displayState = 'normal';
			});
		}
	}
}
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Shape;
import flash.display.Sprite;


class Space3D 
{
	public var display:Sprite;
	
	public function Space3D()
	{
		display = new Sprite();
		display.mouseChildren = false;
		display.mouseEnabled = false;
	}
	
	public function addParent( parent:DisplayObjectContainer, x:Number = 0, y:Number = 0 ):void 
	{
		parent.addChild( display );
		display.x = x;
		display.y = y;
	}
	
	public function position( target:DisplayObject, x:Number = 0, y:Number = 0, z:Number = 0 ):void
	{
		if( ! target.parent || target.parent != display ) display.addChild( target );
		target.x = x;
		target.y = y;
		target.z = z;
	}
	
	public function rotate( x:Number, y:Number = 0, z:Number = 0 ):void
	{
		display.rotationX += x;
		display.rotationY += y;
		display.rotationZ += z;
	}
	
	public function rotateObjects( x:Number, y:Number = 0, z:Number = 0 ):void
	{
		var child:DisplayObject;
		for (var i:int = 0; i < display.numChildren; i++) 
		{
			child = display.getChildAt( i );
			child.rotationX += x;
			child.rotationY += y;
			child.rotationZ += z;
		}
	}
}

class C extends Shape
{
	static public var SIZE:uint = 10;
	static public var ALPHA:Number = 0.5;
	
	public function C( color:uint = 0xFF0000 )
	{
		graphics.lineStyle(0.1, color);
		graphics.beginFill( color, ALPHA );
		graphics.drawCircle( 0, 0, SIZE );
		graphics.endFill();
		//graphics.moveTo( 0, 0 );
		//graphics.lineTo( 0, SIZE );
	}
}
/**
 * @param	h [0,360]
 * @param	s [0,1]
 * @param	v [0,1]
 * @return HEX color
 */
function HSV2HEX(h:Number, s:Number, v:Number ):uint
{
	var r:Number, g:Number, b:Number;
	var hi:int = Math.floor(h/60) % 6;
	var f:Number = h/60 - Math.floor(h/60);
	var p:Number = (v * (1 - s));
	var q:Number = (v * (1 - f * s));
	var t:Number = (v * (1 - (1 - f) * s));
	switch(hi){
		case 0: r = v; g = t; b = p; break;
		case 1: r = q; g = v; b = p; break;
		case 2: r = p; g = v; b = t; break;
		case 3: r = p; g = q; b = v; break;
		case 4: r = t; g = p; b = v; break;
		case 5: r = v; g = p; b = q; break;
	}
	return (Math.round(r * 255) << 16) | (Math.round(g * 255) << 8) | Math.round(b * 255);
}