forked from: 物欲レボリューション
forked from 物欲レボリューション (diff: 249)
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;
}
}
}