forked from: flash on 2010-1-25

by harund
♥0 | Line 177 | Modified 2010-01-26 18:14:10 | MIT License
play

ActionScript3 source code

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

// forked from Fumio's flash on 2010-1-25
package {
	import flash.display.Sprite;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.system.Security;
	import flash.geom.ColorTransform;
	import flash.geom.Rectangle;
	
	public class Main extends Sprite {
		private var _mulitiLoader:MultiLoader;//Fileローダー
		public function Main() {
			//検索結果のロード
			var myURLLoader:URLLoader = new URLLoader();
			myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
			var xmlURL:String = "http://photos.googleapis.com/data/feed/base/all?alt=rss&kind=photo&q=apple%20fruits&imglic=commercial&max-results=20&imgmax=144";
			//crossdomain.xml(クロスドメインポリシーファイル)の位置を指定
			Security.loadPolicyFile("http://photos.googleapis.com/data/crossdomain.xml");		//*1
			myURLLoader.load(new URLRequest(xmlURL));
		}
		
		private function onCompleteXML(e:Event):void {
			//取得したデータをXML型にする。
			var myXML:XML = new XML(e.currentTarget.data);		//*2
			
			//XMLを解析
			var titleStr:String = myXML.channel.item[0].title;		//*3
			var linkURL:String = myXML.channel.item[0].link;		//*4
			//namespaceを設定
			default xml namespace = new Namespace("http://search.yahoo.com/mrss/");		//*5
			var creditStr:String = myXML.channel.item[0].group.credit;		//*6
			var imgURL:String = myXML.channel.item[0].group.content.@url;		//*7
			
			//読み込んだXMLから画像のURLを取り出し、ファイルローダーにaddする。
			_mulitiLoader = new MultiLoader("main");
			var n:int = myXML.channel.item.length();
			for (var i:int = 0; i < n; i++) {
				_mulitiLoader.add(String(myXML.channel.item[i].group.content.@url),{context:new LoaderContext(true)});
			}
			//ファイル読み込みが完了するとonComp発動
			_mulitiLoader.addEventListener(MultiLoader.COMPLETE, onComp);
			_mulitiLoader.start();
		}
		
		private var _red:Sample5;
		private var _blue:Sample5;
		private var _bitmapData:BitmapData
		
		public function onComp(event:Event):void {
			_red = new Sample5( -50,_mulitiLoader);
			addChild(_red);
			
			_blue = new Sample5(50,_mulitiLoader);
			addChild(_blue);
			
			_bitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,false,0x000000);
			addChild(new Bitmap(_bitmapData));
			
			addEventListener(Event.ENTER_FRAME, loop);
		}
		
		private function loop(e:Event):void {
			_red.loop(null);
			_blue.loop(null);
			
			_bitmapData.lock();
			_bitmapData.fillRect(new Rectangle(0,0,stage.stageWidth,stage.stageHeight), 0x000000);
			_bitmapData.draw(_red, null,new ColorTransform(1,0,0,1,0,0,0,0));
			_bitmapData.draw(_blue, null,new ColorTransform(0,1,1,1,0,0,0,0), "add");
			_bitmapData.unlock();
		}
	}
}


import flash.display.*;
import flash.events.*;
import flash.filters.*;

import org.papervision3d.view.*;
import org.papervision3d.materials.*;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*
import flash.system.Security;

//	[SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "#000000")]

class Sample5 extends BasicView 
{    
	// const vars
	static private const OBJ_LENGTH   :int = 20;
	static private const CIRCLE_RANGE :int = 500;
	
	// 3d vars
	private var list :Array = []
	private var wrap :DisplayObject3D;
	/**
	 * Constructor
	 */
	public function Sample5(dX:Number,mulitiLoader:MultiLoader)
	{
		
		//camera
		camera.x         = -dX;
		camera.y         = 200;
		camera.z         = 1000;
		camera.rotationX = 5;
		
		// wrap
		wrap = new DisplayObject3D();
		scene.addChild(wrap);
		wrap.x = -dX / 3;
		
		for (var i:int = 0; i < OBJ_LENGTH; i++)
		{
			var rot:Number = 360 * i / OBJ_LENGTH ;
			
			//var m:BitmapFileMaterial = new BitmapFileMaterial(textureURLs[i]);
			//m.checkPolicyFile = true;
			//ファイルローダーで読み込んだ画像のBitmapDataをPV3Dに渡す
			var bitmapData:BitmapData = mulitiLoader.getBitmapData(mulitiLoader.items[i].url.url);
			var m:BitmapMaterial = new BitmapMaterial(bitmapData);
			//var m:ColorMaterial = new ColorMaterial(0xFFFFFF);
			m.doubleSided = true;
			
			var o:Plane = new Plane(m, 250, 250);
			o.x = CIRCLE_RANGE * Math.sin(rot * Math.PI / 180);
			o.y = 0;
			o.z = CIRCLE_RANGE * Math.cos(rot * Math.PI / 180);
			o.rotationY = rot+90;//+90
			o.useOwnContainer = true; //ココ重要
			
							// 配列に追加 & wrapの子供にする
			list.push(wrap.addChild(o));
		}
		
		//addEventListener(Event.ENTER_FRAME, loop);
		startRendering(); 
	}
	
			// loop
	public function loop(event:Event):void
	{
		wrap.yaw(-1);
					
					// 被写界深度
		for (var i:int = 0; i < list.length; i++)
		{
			var o:DisplayObject3D = list[i] as DisplayObject3D;
			var blur:Number = Math.ceil((CIRCLE_RANGE - o.sceneZ) / 50); 
			o.filters = [new BlurFilter(blur, blur, 2)];
		}
	}
}


/*
* Fileローダー
* */
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.system.Security;
import flash.utils.Dictionary;
class MultiLoader{
    public static var IMAGE_EXTENSIONS:Array = ["swf", "jpg", "jpeg", "gif", "png"];
    public static var TEXT_EXTENSIONS:Array = ["txt", "js", "xml", "php", "asp"];
    public static const COMPLETE:String = "complete";
    private var _listener:Function = function(event:Event):void{};
    private var _loads:Dictionary;
    private var _loadCount:int;
    private var _itemsLoaded:int;
    public var items:Array;
    public function MultiLoader(name:String){
        _loads = new Dictionary();
        _itemsLoaded = 0;
        items = [];
    }
    public function add(url:String,props:Object = null):void{
        var loadingItem:LoadingItem = new LoadingItem();
        loadingItem.url = new URLRequest(url);
        loadingItem.type = getType(url);
        if(props){
            if(props.context){
                loadingItem.context = props.context;
            }
        }
        items.push(loadingItem); 
    }
    private function getType(url:String):String{
        var i:int;
        var extension:String;
        var n:int = IMAGE_EXTENSIONS.length;
        var result:String = "";
        for (i = 0; i < n; i++) {
            extension = IMAGE_EXTENSIONS[i];
            if(extension == url.substr(-extension.length).toLowerCase()){
                result = "image";
                break;
            }
        }
        if(result == ""){
            n = TEXT_EXTENSIONS.length;
            for (i = 0; i < n; i++) {
                extension = TEXT_EXTENSIONS[i];
                if(extension == url.substr(-extension.length).toLowerCase()){
                    result = "text";
                    break;
                }
            }
        }
        return result;
    }
    
    public function start():void{
        var n:int = items.length;
        for (var i:int = 0; i < n; i++) {
            var type:String = items[i].type;
            if(type == "image"){
                _loads[items[i].url.url] = loadImage(items[i].url,items[i].context);
            }if(type == "text"){
                _loads[items[i].url.url] = loadText(items[i].url);
            }
            
        }
    }
    public function addEventListener(type:String,listener:Function):void{
        _listener = listener;
    }
    public function getBitmap(key:String):Bitmap{
        var bitmap:Bitmap = _loads[key].content;
        return bitmap;
    }
    public function getBitmapData(key:String):BitmapData{
        var bitmap:Bitmap = getBitmap(key);
        var bitmapData:BitmapData = new BitmapData(bitmap.width,bitmap.height);
        bitmapData.draw(bitmap);
        return bitmapData;
    }
    private function loadImage(url:URLRequest,context:LoaderContext = null):Loader {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
        loader.load(url,context);
        return loader;
    }
    public function getText(key:String):String{
        return _loads[key].data;
    }
    private function loadText(url:URLRequest):URLLoader{
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE,onComp);
        loader.load(url);
        return loader;
    }
    private function onComp(event:Event):void {
        _itemsLoaded ++;
        if(_itemsLoaded == items.length){
            _listener(event);
        }
    }
    public function get itemsTotal():int{
        return items.length;
    }
    public function get itemsLoaded():int{
        return _itemsLoaded;
    }
    public function get loadedRatio():Number {
        return _itemsLoaded/items.length;
    }
}
class LoadingItem{
    public var url:URLRequest;
    public var type:String;
    public var status:String;
    public var context:LoaderContext;
    public function LoadingItem(){};
}