forked from: フォト蔵レボリューション。forked from: 物欲レボリューション
/**
* Copyright joze ( http://wonderfl.net/user/joze )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/m6I1
*/
// forked from ken_b4u's フォト蔵レボリューション。forked from: 物欲レボリューション
/*
フォト蔵レボリューション。
2010/12/15
umhrさんの
物欲レボリューション。をフォーク
キーワードを入力してEnterをぱーんっと。
エラーハンドルはしてない
crossdomain.xmlとか忘れてたよー。
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Stage;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.navigateToURL;
import flash.display.Loader;
import flash.display.BitmapData;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.system.System;
import flash.system.Security;
[SWF(width="465", height="465", frameRate="30", backgroundColor="0xFFFFFF")]
public class Main extends Sprite {
public function Main(){
//↓タイムラインに書いていたコード
var Math3d:Math3dClass = new Math3dClass();
var Poz:PozClass = new PozClass();
var Render:RenderClass = new RenderClass();
var LoadImg:LoadImgClass = new LoadImgClass();
var Ctrl:CtrlClass = new CtrlClass();
var Utilities:UtilitiesClass = new UtilitiesClass();
Security.loadPolicyFile("http://blog.kentaroumuramatsu.com/crossdomain.xml");
var keyword:TextField = new TextField();
stage.addChild(keyword);
keyword.border = true;
keyword.x = 5;
keyword.y = 5;
keyword.width = 200;
keyword.height = 20;
keyword.type = TextFieldType.INPUT;
var notice:TextField = new TextField();
stage.addChild(notice);
notice.x = 200;
notice.y = 230;
notice.width = 200;
notice.height = 20;
notice.text = "now loading";
notice.visible = false;
var model_array:Array = new Array();
function setModel():void{
for (var i:int = 0; i<100; i++) {
model_array[i] = [[0,0,0],[-75,-75,0],[0,-75,0],[75,-75,0],[-75,0,0],[0,0,0],[75,0,0],[-75,75,0],[0,75,0],[75,75,0]];
var _z:Number = (i-50)/4;
Poz.local_array[i] = [0,0,_z,0,0,0];
Poz.localTo_array[i] = [Math.random()*10-5,Math.random()*10-5,_z,0,0,0];
spriteCount_array[i] = 0;
}
}
var spriteCount_array:Array = new Array();
setModel();
var count100:int = 0;
var count100To:int = 0;
var count100Count:int = -1;
function shuffle():void{
var shuffle_array:Array = Utilities.shuffle(100);
for (var i:int = 0; i<100; i++) {
var j:int = shuffle_array[i];
spriteCount_array[i] = 0;
Poz.localTo_array[i] = [Math.random()*10-5,Math.random()*10-5,(j-50)/4,0,0,0];
}
Poz.globalTo_array[4] = 0;
if(count100To == 0){
count100To = (img_array.length)%100;
}else{
count100To = 0;
}
count100Count = 0;
}
function setSprite():void{
var _length:int = model_array.length;
for (var i:int = 0; i<_length; i++) {
var _sp:Sprite = new Sprite();
stage.addChild(_sp);
_sp.x = stage.stageWidth/2;
_sp.y = stage.stageHeight/2;
_sp.name = "thumb__"+i;
sp_array[i] = _sp;
}
}
var sp_array:Array = new Array();
setSprite();
//
function fnMain(e:Event):void{
if(count100 == 0){
Poz.globalTo_array[4] += 0.01;
}else{
Poz.globalTo_array[4] -= 0.01;
}
Poz.global_array[4] = Poz.global_array[4]*0.99 + Poz.globalTo_array[4]*0.01;
fnMov(Poz.local_array);
var poz_array:Array = new Array();
poz_array = Math3d.arrayClone(model_array);
//fnRotation(Poz.local_array);
Math3d.localAffine(poz_array,Poz.local_array);
Math3d.globalAffine(poz_array,Poz.global_array);
Math3d.pertrans(poz_array);
Poz.zSort(poz_array,sp_array,stage);
render(poz_array);
}
function fnMov(local_array:Array):void{
for (var i:int = 0; i<100; i++) {
if(spriteCount_array[i] < 1){
spriteCount_array[i] += 0.01;
}else{
continue
}
spriteCount_array[i] = Math.min(spriteCount_array[i],1);
var countX:Number = xTween(spriteCount_array[i]);
Poz.local_array[i][0] = Poz.local_array[i][0]*(1-countX) + Poz.localTo_array[i][0]*countX;
var countY:Number = yTween(spriteCount_array[i]);
Poz.local_array[i][1] = Poz.local_array[i][1]*(1-countY) + Poz.localTo_array[i][1]*countY;
var countRY:Number = pow2Tween(spriteCount_array[i]);
Poz.local_array[i][2] = Poz.local_array[i][2]*(1-countRY) + Poz.localTo_array[i][2]*countRY;
Poz.local_array[i][4] = Poz.local_array[i][4]*(1-countRY) + Poz.localTo_array[i][4]*countRY;
}
if(Math.random() > 0.1){
var a:int = Math.floor(Math.random()*100);
var b:int = Math.floor(Math.random()*100);
var abX:Number = Poz.localTo_array[a][0] - Poz.localTo_array[b][0];
var abY:Number = Poz.localTo_array[a][1] - Poz.localTo_array[b][1];
var abZ:Number = Poz.localTo_array[a][2] - Poz.localTo_array[b][2];
var abXY:Number = Math.sqrt(abX*abX+abY*abY+abZ*abZ);
if(abXY < 300){
Poz.localTo_array[a][0] += abX;
Poz.localTo_array[a][1] += abY;
Poz.localTo_array[a][2] += abZ;
Poz.localTo_array[b][0] -= abX;
Poz.localTo_array[b][1] -= abY;
Poz.localTo_array[b][2] -= abZ;
spriteCount_array[a] = 0;
spriteCount_array[b] = 0;
}
}else{
if(Math.random() > 0.95 && Math.abs(Poz.globalTo_array[4]) > 20){
shuffle();
}
}
if(Math.abs((Math.abs(Poz.global_array[4])+Math.PI/2)%Math.PI-Math.PI) < 0.1){
if(Math.abs((Math.abs(Poz.global_array[4])+Math.PI/2)%(Math.PI*2)-Math.PI) < Math.PI/2){
for (var j:int = 0; j<100; j++) {
Poz.localTo_array[j][4] = Math.PI;
if(0.5 < spriteCount_array[j] && spriteCount_array[j] < 1){
spriteCount_array[j] = 0.5;
}
}
}else{
for (var k:int = 0; k<100; k++) {
Poz.localTo_array[k][4] = 0;
if(0.5 < spriteCount_array[k] && spriteCount_array[k] < 1){
spriteCount_array[k] = 0.5;
}
}
}
}
}
function xTween(c:Number):Number{
return pow2Tween(Math.min(1,c*2));
}
function yTween(c:Number):Number{
return pow2Tween(Math.max(0,(c-0.5)*2));
}
function pow2Tween(c:Number):Number{
return c*c;
}
function pow4Tween(c:Number):Number{
return c*c*c*c;
}
function fnRotation(local_array:Array):void{
var _length:int = local_array.length;
for (var i:int = 0; i<_length; i++) {
var _y:Number = local_array[i][1];
var _z:Number = local_array[i][2];
local_array[i][3] = Math.atan2(_z,_y)-Math.PI/2;
}
}
function render(poz_array:Array):void{
var _length:int = poz_array.length;
if(count100Count > -1){
if(count100Count < 20){
count100Count ++
}else{
count100Count = -1;
count100 = count100To;
}
}
for (var i:int = 0; i<_length; i++) {
var _sp:Sprite = sp_array[i];
_sp.graphics.clear();
if(poz_array[i][0][2] < 0 || 1.5 < poz_array[i][0][2]){
continue;
}
Render.drawQuadrangleImage(_sp,[poz_array[i][1],poz_array[i][3],poz_array[i][7],poz_array[i][9]],bmp1_array[count100+i]);
}
}
var loadComp:Function = function ():void{
var _length:int = img_array.length;
for (var i:int = 0; i<_length; i++) {
var bmp_data:BitmapData = new BitmapData(150,150, false, 0x00FFFFFF);
bmp_data.draw(img_array[i]);
bmp1_array[i] = bmp_data;
}
stage.addEventListener(Event.ENTER_FRAME,fnMain);
//stage.removeChild(_nowloading);
}
var bmp1_array:Array = new Array();
var bmp4_array:Array = new Array();
var img_array:Array = new Array();
LoadImg.loadComp = loadComp;
var linkURL_array:Array = new Array();
var url_loader : URLLoader = new URLLoader();
// 読み込み完了時に呼び出されるイベント
url_loader.addEventListener (Event.COMPLETE,LoaderInfoCompleteFunc);
function LoaderInfoCompleteFunc (event : Event):void {
var xml:XML = new XML(url_loader.data);
var _length:int = xml.info.photo.length()
var jpgURL_array:Array = new Array();
for (var i:int = 0; i<_length; i++) {
var _xml:XML = new XML(xml.info.photo[i]);
var str:String = _xml.thumbnail_image_url;
if(str != "") {
jpgURL_array.push(str);
linkURL_array.push(_xml.url);
}
}
img_array = LoadImg.loadArray(jpgURL_array);
notice.visible = false;
}
//メニュー用リスナー
stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.ENTER || event.keyCode == 13) {
notice.visible = true;
var url:URLRequest = new URLRequest("http://blog.kentaroumuramatsu.com/files/photozou.php?keyword=" + keyword.text);
url_loader.load(url);
}
})
stage.addEventListener(MouseEvent.MOUSE_MOVE,stageMouseEventMOUSE_MOVE);
function stageMouseEventMOUSE_MOVE(event:MouseEvent):void{
var _array:Array = Ctrl.getHighestDepthObjectUnderPoint(stage);
if(_array[0] == "thumb"){
spriteCount_array[_array[1]] = 0;
}
}
//
stage.addEventListener(MouseEvent.MOUSE_UP,stageMouseEventMOUSE_UP);
function stageMouseEventMOUSE_UP(event:MouseEvent):void{
var _array:Array = Ctrl.getHighestDepthObjectUnderPoint(stage);
if(_array[0] == "thumb"){
var url:URLRequest = new URLRequest(linkURL_array[count100 + int(_array[1])]);
navigateToURL( url );
}
}
//↑タイムラインに書いていたコード
}
}
}
/////////////////////////////////////////
import flash.geom.Point;
class CtrlClass{
//クラスプロパティ
//クラスメソッド
//コンストラクタ
public function CtrlClass(){};
//インスタンスプロパティ
//マウス位置の一番手前のオブジェクトの名前を取得
public function getHighestDepthObjectUnderPoint(_stage:Object):Array{
var list:Array = _stage.getObjectsUnderPoint(new Point(_stage.mouseX , _stage.mouseY));
var l:int = list.length;
var _array:Array = new Array();
if(l > 0){
//上から順にnameを確認
for (var i:int = 0; i<l; i++) {
var str:String = list[l-1-i].name;
_array = str.split("__");
if(_array.length == 2){break};
//該当無しの場合、-1を返す。
_array = [-1,-1];
}
};
return _array;
}
}
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.*;
import flash.net.URLRequest;
class LoadImgClass{
public var loadImgRequest:int = 0;
public var loadImgComp:int = 0;
//全てのロード完了時に実行される関数を登録する。
public var loadComp:Function = function():void{};
private function comp():void{
loadImgComp ++;
if(loadImgRequest == loadImgComp){
loadImgComp = 0;
loadImgRequest = 0;
loadComp();
}
}
public function loadImg(_url:String):Loader{
loadImgRequest++;
var loader_obj:Loader = new Loader();
var url:URLRequest = new URLRequest("http://blog.kentaroumuramatsu.com/files/photozouimg.php?url=" + _url);
var info:LoaderInfo = loader_obj.contentLoaderInfo;
info.addEventListener (Event.COMPLETE,fnLoaderInfoComplete);
function fnLoaderInfoComplete(event:Event):void{
comp();
//info.removeEventListener(Event.COMPLETE,fnLoaderInfoComplete);
}
loader_obj.load(url);
return loader_obj;
}
public function loadArray(request_array:Array):Array{
var return_array:Array = new Array();
var _length:int = request_array.length;
for (var i:int = 0; i < _length; i++) {
var _url:String = request_array[i];
if(_url != ""){
return_array[i] = loadImg(request_array[i]);
}else{
return_array[i] = "";
}
}
return return_array;
}
}
class Math3dClass{
//arrayの複製。再起処理を行っている。
public function arrayClone(ar:Array):Array {
var _array:Array = new Array();
var _len:int = ar.length;
for (var i:int = 0; i<_len; i++) {
_array[i]=(ar[i] is Array)?arrayClone(ar[i]):ar[i];
}
return _array;
}
//ペアトランス
public function pertrans(arg_array:Array):void{
var _length:int = arg_array.length;
for (var i:int = 0; i<_length; i++) {
var j_length:int = arg_array[i].length;
for (var j:int = 0; j<j_length; j++) {
var _per:Number = 1000/(1000+arg_array[i][j][2]);
arg_array[i][j] = [arg_array[i][j][0] * _per,arg_array[i][j][1] * _per,_per];
}
}
}
//ローカル座標でのアフィン変換Affin transform
//,index_array:Array
public function localAffine(data_array:Array,poz_array:Array):void {
var _length:uint = new uint(data_array.length);
for (var i:int = 0; i<_length; i++) {
//var index:int = index_array[i];
var index:int = i;
var n_cx:Number = Math.cos(poz_array[index][3]);
var n_sx:Number = Math.sin(poz_array[index][3]);
var n_cy:Number = Math.cos(poz_array[index][4]);
var n_sy:Number = Math.sin(poz_array[index][4]);
var n_cz:Number = Math.cos(poz_array[index][5]);
var n_sz:Number = Math.sin(poz_array[index][5]);
var d_x:Number = poz_array[index][0];
var d_y:Number = poz_array[index][1];
var d_z:Number = poz_array[index][2];
var af_xx:Number = n_cz*n_cy+n_sx*n_sy*n_sz;
var af_xy:Number = n_sx*n_sy*n_cz-n_sz*n_cy;
var af_xz:Number = n_sy*n_cx;
var af_yx:Number = n_cx*n_sz;
var af_yy:Number = n_cx*n_cz;
var af_yz:Number = -n_sx;
var af_zx:Number = n_cy*n_sx*n_sz-n_sy*n_cz;
var af_zy:Number = n_sy*n_sz+n_cy*n_sx*n_cz;
var af_zz:Number = n_cx*n_cy;
var i_length:uint = new uint(data_array[i].length);
for (var j:uint = 0; j<i_length; j++) {
var af_x:Number = data_array[i][uint(j)][uint(0)];
var af_y:Number = data_array[i][uint(j)][uint(1)];
var af_z:Number = data_array[i][uint(j)][uint(2)];
data_array[i][uint(j)][uint(0)] = af_x*af_xx+af_y*af_xy+af_z*af_xz+d_x;
data_array[i][uint(j)][uint(1)] = af_x*af_yx+af_y*af_yy+af_z*af_yz+d_y;
data_array[i][uint(j)][uint(2)] = af_x*af_zx+af_y*af_zy+af_z*af_zz+d_z;
}
}
}
//グローバル座標でのアフィン変換Affin transform
public function globalAffine(data_array:Array,poz_array:Array):void {
var d_x:Number = poz_array[uint(0)];
var d_y:Number = poz_array[uint(1)];
var d_z:Number = poz_array[uint(2)];
var _cx:Number = Math.cos(poz_array[uint(3)]);
var _sx:Number = Math.sin(poz_array[uint(3)]);
var _cy:Number = Math.cos(poz_array[uint(4)]);
var _sy:Number = Math.sin(poz_array[uint(4)]);
var _cz:Number = Math.cos(poz_array[uint(5)]);
var _sz:Number = Math.sin(poz_array[uint(5)]);
var af_xx:Number = _cz*_cy+_sx*_sy*_sz;
var af_xy:Number = _sx*_sy*_cz-_sz*_cy;
var af_xz:Number = _sy*_cx;
var af_yx:Number = _cx*_sz;
var af_yy:Number = _cx*_cz;
var af_yz:Number = -_sx;
var af_zx:Number = _cy*_sx*_sz-_sy*_cz;
var af_zy:Number = _sy*_sz+_cy*_sx*_cz;
var af_zz:Number = _cx*_cy;
var _length:uint = new uint(data_array.length);
for (var i:uint = 0; i<_length; i++) {
var i_length:uint = new uint(data_array[i].length);
for (var j:uint = 0; j<i_length; j++) {
var af_x:Number = data_array[i][uint(j)][uint(0)];
var af_y:Number = data_array[i][uint(j)][uint(1)];
var af_z:Number = data_array[i][uint(j)][uint(2)];
data_array[i][uint(j)][uint(0)] = af_x*af_xx+af_y*af_xy+af_z*af_xz+d_x;
data_array[i][uint(j)][uint(1)] = af_x*af_yx+af_y*af_yy+af_z*af_yz+d_y;
data_array[i][uint(j)][uint(2)] = af_x*af_zx+af_y*af_zy+af_z*af_zz+d_z;
}
}
}
}
class PozClass{
//globalの座標[x,y,z,xr,yr,zr];
public var global_array:Array = new Array(0,0,2000,0,0,0);
public var globalTo_array:Array = new Array(0,0,2000,0,0,0);
public var local_array:Array = new Array();
public var localTo_array:Array = new Array();
//インスタンスメソッド
public function zSort(poz_array:Array,sp_array:Array,target:Object):void{
var _length:int = poz_array.length;
var z_array:Array = new Array();
for (var i:int = 0; i<_length; i++) {
z_array[i] = poz_array[i][0][2];
}
z_array = z_array.sort(Array.NUMERIC|Array.RETURNINDEXEDARRAY|Array.DESCENDING);
for (var j:int = 0; j<_length; j++) {
var _z:int = z_array[j];
target.setChildIndex(sp_array[_z],0);
}
}
}
class RenderClass{
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.display.BitmapData;
public function drowLine(_sp:Sprite,poz_array:Array,_thickness:Number = 0,_color:int = 0xff0000,_alpha:Number = 1):void{
//if(_color == -1){_color = defaultColor};
_sp.graphics.lineStyle(_thickness,_color,_alpha)
//_sp.graphics.beginFill (0,0);
var _l:int = poz_array.length;
_sp.graphics.moveTo(poz_array[_l-1][0],poz_array[_l-1][1]);
for (var j:int = 0; j<_l; j++) {
_sp.graphics.lineTo(poz_array[j][0],poz_array[j][1]);
}
_sp.graphics.lineStyle()
}
public function drawQuadrangleImage(_sp:Sprite,poz_array:Array,bmp_data:BitmapData):void{
var bmp_dataW:Number = bmp_data.width;
var bmp_dataH:Number = bmp_data.height;
var _matrix:Matrix = setMatrix(poz_array[0],poz_array[1],poz_array[2],bmp_dataW,bmp_dataH);
_sp.graphics.beginBitmapFill(bmp_data, _matrix, false, false);
_sp.graphics.moveTo(poz_array[0][0],poz_array[0][1]);
_sp.graphics.lineTo(poz_array[1][0],poz_array[1][1]);
_sp.graphics.lineTo(poz_array[2][0],poz_array[2][1]);
_sp.graphics.endFill();
var _ltX:Number = poz_array[2][0] - poz_array[3][0] + poz_array[1][0];
var _ltY:Number = poz_array[2][1] - poz_array[3][1] + poz_array[1][1];
_matrix = setMatrix([_ltX,_ltY],poz_array[1],poz_array[2],bmp_dataW,bmp_dataH);
_sp.graphics.beginBitmapFill(bmp_data, _matrix, false, false);
_sp.graphics.moveTo(poz_array[1][0],poz_array[1][1]);
_sp.graphics.lineTo(poz_array[2][0],poz_array[2][1]);
_sp.graphics.lineTo(poz_array[3][0],poz_array[3][1]);
_sp.graphics.endFill();
}
private function setMatrix(poz0_array:Array,poz1_array:Array,poz2_array:Array,_w:Number,_h:Number):Matrix{
var _matrix:Matrix = new Matrix();
_matrix.a = (poz1_array[0]-poz0_array[0])/_w;
_matrix.b = (poz1_array[1]-poz0_array[1])/_w;
_matrix.c = (poz2_array[0]-poz0_array[0])/_h;
_matrix.d = (poz2_array[1]-poz0_array[1])/_h;
_matrix.tx = poz0_array[0];
_matrix.ty = poz0_array[1];
return _matrix;
}
}
class UtilitiesClass{
import flash.geom.ColorTransform;
/*
色の明度を相対的に変える関数。
rgb値と割合を与えて、結果を返す。
rgbは、0xffffff段階の値。
ratioが0の時に0x000000に、1の時にそのまま、2の時には0xffffffになる。
相対的に、ちょっと暗くしたい時には、ratioを0.8に、
ちょっと明るくしたい時にはratioを1.2などに設定する。
*/
public function rgbBrightness(rgb:int,ratio:Number):int{
if(ratio < 0 || 2 < ratio){ratio = 1;trace("function colorBrightness 範囲外")}
var _r:int = rgb >> 16;//16bit右にずらす。
var _g:int = rgb >> 8 & 0xff;//8bit右にずらして、下位8bitのみを取り出す。
var _b:int = rgb & 0xff;//下位8bitのみを取り出す。
if(ratio <= 1){
_r *= ratio;
_g *= ratio;
_b *= ratio;
}else{
_r = (255 - _r)*(ratio-1)+_r;
_g = (255 - _g)*(ratio-1)+_g;
_b = (255 - _b)*(ratio-1)+_b;
}
return _r<<16 | _g<<8 | _b;
}
//フィールドカラーに変色するための関数
//6桁16進数から、2桁ぶんずつを取り出す。
//色情報は24bit。r8bit+g8bit+b8bit。24桁の二進数
public function rgb2color(rgb:int,ratio:Number = 1):ColorTransform{
//ratioが1以外の場合、明度変更関数へ
if(ratio != 1){rgb = rgbBrightness(rgb,ratio)};
var color:ColorTransform = new ColorTransform();
color.redMultiplier = color.blueMultiplier = color.greenMultiplier = 0;
color.redOffset = rgb >> 16;//16bit右にずらす。
color.greenOffset = rgb >> 8 & 0xff;//8bit右にずらして、下位8bitのみを取り出す。
color.blueOffset = rgb & 0xff;//下位8bitのみを取り出す。
return color;
}
public function shuffle(_n:int):Array {
var _array:Array = new Array();
for (var i:int= 0; i<_n; i++){
_array[i] = Math.random();
}
return _array.sort(Array.RETURNINDEXEDARRAY);
}
}