画面スクロールA
操作方法、工夫した点、解説したい内容、こだわったところや参考文献のURL等を書いてください
書かない場合、クラス宣言までのコメント文から自動抽出します
♥0 |
Line 122 |
Modified 2012-04-11 18:08:51 |
MIT License
archived:2017-03-30 02:55:30
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;
}
}
}