- 2008年7月 9日 18:02
- ActionScript 3.0
ActionScript3.0でドラッグの動作を実現させるためには、startDrag(),stopDrag()を使います。
単純なドラッグ処理でしたらこれだけでも十分なのですが、
ドラッグとクリックを分けたいという場合がでてきます。
こういう場合、Pointクラスのdistanceメソッドを使って判定処理を行うことで実現できます。
http://xingxx.com/sample/drag.html
流れとしては以下のような感じになります。
- マウスが押されたら座標を取得する
- マウスが押された状況でマウスを動かしているかをイベントでキャッチする
- 動いていたらドラッグの開始
- マウスが離されたら座標を取得
- 二つの座標を比べ、0だったらクリック処理、それ以外だったらドラッグの処理として判定する
ソースにすると以下のようになります。
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.Point;
/*ドラッグアンドドロップ*/
public class Smile extends Sprite {
private var savePointArray;
private var pop:Pop;
public function Smile():void{
init();
addEventListener(Event.ADDED_TO_STAGE,addedHandler)
}
//表示リストに追加イベント
private function addedHandler(e:Event):void {
//表示をセンターに
x = stage.stageWidth / 2;
y = stage.stageHeight / 2;
}
private function init():void {
createPoP();
savePointArray = new Array();
addEventListener(MouseEvent.MOUSE_DOWN, mosueDownHandler)
addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)
}
//マウスダウンイベント
private function mosueDownHandler(e:MouseEvent):void {
//クリック位置のステージ座標でポイントを生成
savePointArray[0] = new Point(e.stageX,e.stageY)
addEventListener(MouseEvent.MOUSE_MOVE, mosueMoveHandler)
}
//マウスムーブイベント
private function mosueMoveHandler(e:MouseEvent):void {
pop.visible = false;
//ドラッグの開始
startDrag();
}
//マウスアップイベント
private function mouseUpHandler(e:MouseEvent):void {
//マウスムーブイベントのリムーブ
removeEventListener(MouseEvent.MOUSE_MOVE, mosueMoveHandler)
//マウスが離されたステージ座標でポイントの生成
savePointArray[1] = new Point(e.stageX, e.stageY)
//生成されたポイント二つを比べる
if (Point.distance(savePointArray[0], savePointArray[1])) {//0以外だったら
stopDrag();//ドラッグの終了
}else {//ドラッグされていない場合の処理
pop.visible = true;
}
}
private function createPoP():void{
pop = new Pop();
with (pop) {
x = 150;
y = -80;
visible = false;
}
addChild(pop)
}
}
}



