画面スクロールA

by tepe
操作方法、工夫した点、解説したい内容、こだわったところや参考文献のURL等を書いてください
書かない場合、クラス宣言までのコメント文から自動抽出します
♥0 | Line 122 | Modified 2012-04-11 18:08:51 | 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/pHXp
 */

package {
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        private var sc:overScroll = new overScroll();
        private var s:Sprite = new Sprite();
        public function FlashTest() {
            // write as3 code here..
            s.graphics.beginFill(0x000000);
            s.graphics.drawRect(0,0,50,50);
            s.graphics.endFill();
            s.x = 100;
            s.y = 100;
            addChild(s);
            sc.showArea=true;
            sc.setArea(223,223,100);
            sc.movSpeed=2;
            sc.setTarget(s);
            addChild(sc);
        }
    }
}

    import flash.geom.*;
    import flash.display.*;
    import flash.events.*;
    class overScroll extends Sprite{
        private var target:DisplayObject;//スクロール対象
        private var r:Number;//エリアサイズ
        public var movSpeed:Number = 1; 
        public var showArea:Boolean = false;
        private var move:Point = new Point();
        public function overScroll(){
            //init();
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init); 
            addEventListener(MouseEvent.MOUSE_OVER,overMouse);
            addEventListener(MouseEvent.MOUSE_OUT,outMouse);    
        }
        
        private function init():void{
            removeEventListener(Event.ADDED_TO_STAGE, init); 
            //stage.removeEventListener(MouseEvent.MOUSE_DOWN,onDown);
        }

        public function setTarget(t:DisplayObject=null):void{
            if(t==null){
                removeEventListener(Event.ENTER_FRAME,onEnter);
                removeEventListener(MouseEvent.MOUSE_OVER,overMouse);
                removeEventListener(MouseEvent.MOUSE_OUT,outMouse);
            }
            
            target = t;
            

        }
        
        //スクロール領域の設定
        public function setArea(x:Number,y:Number,r:Number):void{
            this.x = x;
            this.y = y;
            this.r = r;
            graphics.clear();
            if(showArea==false)graphics.beginFill(0x000000,0);
            else graphics.beginFill(0xff0000,0.5);
            graphics.drawRect(-r,-r,r*2,r*2);
            graphics.endFill();
        }
        
        //現在のスクロール停止 
        public function scrStop():void{
            removeEventListener(Event.ENTER_FRAME,onEnter);
            removeEventListener(Event.ENTER_FRAME,slowDown);
            move.x=0; move.y=0;
        }
        //スクロール有効
        public function scrOn():void{
            addEventListener(MouseEvent.MOUSE_OVER,overMouse);
            addEventListener(MouseEvent.MOUSE_OUT,outMouse);
        }
        //スクロール無効
        public function scrOff():void{
            removeEventListener(Event.ENTER_FRAME,onEnter);
            removeEventListener(MouseEvent.MOUSE_OVER,overMouse);
            removeEventListener(MouseEvent.MOUSE_OUT,outMouse);
        }

        //マウスダウン
        private function onDown(e:MouseEvent):void{
            scrStop();
            removeEventListener(MouseEvent.MOUSE_OVER,overMouse);
            removeEventListener(MouseEvent.MOUSE_OUT,outMouse);
            stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
        }
        //マウスアップ
        private function onUp(e:MouseEvent):void{  
            addEventListener(MouseEvent.MOUSE_OVER,overMouse);
            addEventListener(MouseEvent.MOUSE_OUT,outMouse);
            stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);
        }

        //エリア内にロールオーバー
        private function overMouse(e:MouseEvent):void{
            stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            stage.removeEventListener(Event.MOUSE_LEAVE,leave);
            removeEventListener(Event.ENTER_FRAME,slowDown);
            removeEventListener(Event.ENTER_FRAME,onEnter);
            //state = "overMouse";
        }
        //エリアの外にロールアウト → スクロール領域
        private function outMouse(e:MouseEvent):void{
            stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            stage.addEventListener(Event.MOUSE_LEAVE,leave);
            addEventListener(Event.ENTER_FRAME,onEnter);
            //state = "outMouse";
        }
        //ステージからロールアウト
        private function leave(e:Event):void{
            removeEventListener(Event.ENTER_FRAME,onEnter);
            addEventListener(Event.ENTER_FRAME,slowDown);
            //state = "mouseLeave";
            stage.addEventListener(MouseEvent.MOUSE_MOVE,stageIn);
        }
        //ステージにロールオーバー → スクロール領域
        private function stageIn(e:MouseEvent):void{
            removeEventListener(Event.ENTER_FRAME,slowDown);
            stage.removeEventListener(MouseEvent.MOUSE_MOVE,stageIn);
            addEventListener(Event.ENTER_FRAME,onEnter);
        }

        
        
        //ステージ外に出た時の処理
        private function slowDown(e:Event):void{
            target.x -=move.x*movSpeed; target.y -=move.y*movSpeed;
            move.x /= 1.02;move.y /= 1.02;
            if(Math.abs(move.x)<0.1 && Math.abs(move.y)<0.1){//
                removeEventListener(Event.ENTER_FRAME,slowDown);
                stage.removeEventListener(MouseEvent.MOUSE_MOVE,stageIn);
            }
                
        }
        //ステージ内、エリア外での処理
        private function onEnter(e:Event):void{
            
            
            if(Math.abs(mouseX) > r){//
                move.x = (mouseX/r)*movSpeed;
                target.x -= move.x;
            }
            if(Math.abs(mouseY) > r){//
                move.y = (mouseY/r)*movSpeed;
                target.y -= move.y;
                
            }
        }
    }