forked from: 物欲レボリューション

by tepe forked from 物欲レボリューション (diff: 249)
♥0 | Line 608 | Modified 2012-01-30 11:59:10 | MIT License
play

ActionScript3 source code

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

// forked from umhr's 物欲レボリューション

package {
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.events.*;
    [SWF(width="465", height="465", frameRate="30", backgroundColor="0xFFFFFF")]

    public class Main extends Sprite {
        private function fullScreen(e:MouseEvent):void{
                if(stage.displayState == StageDisplayState.NORMAL)stage.displayState = StageDisplayState.FULL_SCREEN;
        }
        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();

            var model_array:Array = new Array();
            stage.addEventListener(MouseEvent.CLICK,fullScreen);
            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:URLRequest = new URLRequest("http://mztm.heteml.jp/umhr/3d/arss/data.xml");
            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.items.length();
                var jpgURL_array:Array = new Array();
                for (var i:int = 0; i<_length; i++) {
                    var _xml:XML = new XML(xml.items[i]);
                    var i_length:int = _xml.item.length();
                    for (var j:int = 0; j<i_length; j++) {
                        var str:String = _xml.item[j].jpg;
                        if(str != ""){
                            str = str.split("/").pop();
                            str = str.replace(/%/g,"");
                            str = "http://mztm.heteml.jp/umhr/3d/arss/revolution/" + str;
                            jpgURL_array.push(str);
                            linkURL_array.push(_xml.item[j].url);
                        }
                    }
                    
                }
                img_array = LoadImg.loadArray(jpgURL_array);
            }

            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(_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); 
    }
}


//-------------------------------------------------------------------------

    import flash.net.FileReference;
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
    import flash.utils.*;
    import flash.net.navigateToURL;
    import flash.net.URLRequest;


class ozmap extends Sprite{
        
        private var scale:Number = 1;
        
        private var wheel:int;//ホイール回転量
        private var zoom:Number = 1.0;//拡大率
        public var map:Sprite;//フィールド
        
        private var mapFocusX:Number=0;
        private var mapFocusY:Number=0;
        private var scrFocusX:int=0; 
        private var scrFocusY:int=0; 
        private var mX:int=0; 
        private var mY:int=0; 
        
        private var scalingPanel:Sprite;
        private var base:Sprite; 
              
        private var mapscale:int=0;
        private var dragPanel:Shape = new Shape();
        private var onMouseBtn:Boolean;
        private var msk:Sprite = new Sprite();
        
        private var file:FileReference;
        
       
        
        
        //コンストラクタ 
        public function ozmap():void{
 
            //カーソル位置描画
            scalingPanel = new Sprite();//ズーム中心 
            addChild(scalingPanel);
            
            
            //マップ基準座標
            base = new Sprite();     
            scalingPanel.addChild(base);
            
            //マップ上への配置
            map = new Sprite();
            map.addEventListener(MouseEvent.MOUSE_DOWN,down1);
            map.addEventListener(MouseEvent.MOUSE_UP,up1);

            addEventListener(MouseEvent.MOUSE_WHEEL,on_wheel);//ホイール操作 
            addEventListener(Event.ENTER_FRAME, onFrame);//メインループ
 
            base.addChildAt(map,0); 
            map.addChild(dragPanel);
            
            aaaa();   
        }
        
            


        
        public function setAreaRect(x:Number,y:Number,width:Number,height:Number):void{
           this.addChild(msk);
           this.x = x;
           this.y = y;
           msk.graphics.beginFill(0xff0000);
           msk.graphics.drawRect(0,0,width,height);
           msk.graphics.endFill();
           this.mask = msk;
        }


  
        //マップドラッグ
        private var scrOn:Boolean;
        private function down1(event:MouseEvent):void{
            wheel=0;
            scrOn=false;
            onMouseBtn=true;

           event.currentTarget.startDrag();
           addEventListener(MouseEvent.MOUSE_MOVE,onMove);
           event.stopPropagation();//イベントの伝播を止める
        }
        private function up1(event:MouseEvent):void{
            
            onMouseBtn=false;
            event.currentTarget.stopDrag();
            removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
            
           // event.stopPropagation();//イベントの伝播を止める
        }
        
        private function onMove(e:MouseEvent):void{
            aaaa();
        }
    
        //ホイール操作
        private function on_wheel(event:MouseEvent):void{
            wheel += event.delta;        
        }
  
        //メインループ
        private function onFrame(e:Event):void {
            on_zoom();
            //フルスクリーンでのスクロールモード
            
            if(stage.displayState == StageDisplayState.FULL_SCREEN){
                var size:Number = 50;
                if(scrOn==true && onMouseBtn==false){
                    if(stage.mouseY < size)map.y -= (stage.mouseY-size)/zoom/5;
                    else if(this.root.loaderInfo.height-size < stage.mouseY){
                        map.y -= (size+stage.mouseY-this.root.loaderInfo.height)/zoom/5;                    
                    }
                    if(stage.mouseX < 10)map.x -= (stage.mouseX-10)/zoom/10;
                    else if(this.root.loaderInfo.width-10 < stage.mouseX){
                        map.x -= (10+stage.mouseX-this.root.loaderInfo.width)/zoom/10;                    
                    }
                }
                else{
                    if(stage.mouseY < size)scrOn=false;
                    else if(this.root.loaderInfo.height-size < stage.mouseY)scrOn=false;
                    else if(stage.mouseX < 10)scrOn=false;
                    else if(this.root.loaderInfo.width-10 < stage.mouseX)scrOn=false;
                    else scrOn=true;
                }

            }
        }
        
        
        //マップスクロール基準点の更新
        private function aaaa():void{

            if(0<=wheel){
                mX = mouseX; mY = mouseY;//カーソル位置
                //ズーム中心
                scalingPanel.x = mouseX; scalingPanel.y = mouseY; 
                //マップ位置
                base.x -= (mX-scrFocusX)/zoom; base.y -= (mY-scrFocusY)/zoom;
                //フォーカス位置
                scrFocusX = mX; scrFocusY = mY;
            }
            else{
                mX = this.root.loaderInfo.width/2; mY = this.root.loaderInfo.height/2;//カーソル位置
                //ズーム中心
                scalingPanel.x =this.root.loaderInfo.width/2; scalingPanel.y = this.root.loaderInfo.height/2; 
                //マップ位置
                base.x -= (mX-scrFocusX)/zoom; base.y -= (mY-scrFocusY)/zoom;
                //フォーカス位置
                scrFocusX = mX; scrFocusY = mY;
            }

            //フィールドドラッグ用
            dragPanel.graphics.clear();
            dragPanel.graphics.beginFill(0xff0000,0);
            dragPanel.graphics.drawCircle(-(map.x+map.parent.x)/map.scaleX,-(map.y+map.parent.y)/map.scaleY,600/map.scaleX);
            dragPanel.graphics.endFill();
        }

        
        
        private function on_zoom():void{
            if(wheel != 0){
                aaaa();//基準点更新
                
                if(wheel < 0){
                    zoom *= 1+(0.005*wheel);
                }
                else if(0 < wheel){
                    zoom *= 1+(0.005*wheel);
                }
                
                
                if(2 < zoom){

                    map.scaleX *= 2;
                    map.scaleY *= 2;
                    zoom /= 2;
                    map.x += map.x+base.x;
                    map.y += map.y+base.y;
                    
                    mapscale--;
                
                }
                else if(zoom < 1.0){
             
                    map.x -= (map.x+base.x)/2;
                    map.y -= (map.y+base.y)/2;
                    zoom *= 2;
                    map.scaleX /= 2;
                    map.scaleY /= 2;
                    
                    mapscale++;
                    
                }
                scalingPanel.scaleX = zoom;
                scalingPanel.scaleY = zoom;        
            }
          
        }
        
    }