startDrag × getBoundsで華麗にドラッグ
MAKEの熱気にほだされて、年末年始はFlashで
フィジカルコンピューティングにチャレンジしてみようかなーと思っている島田(こ)です。
とりあえず自作YUREXとか、ロボットアーム動かしたりとかしてみたい。
先日案件でまたまたgetBoundsにお世話になりました。
オブジェクトのマウスドラッグを簡単に実装できるstartDrag。
ドラッグが可能な範囲をRectangleで簡単に指定できる点も便利ですよね。
ただドラッグが可能な範囲は、オブジェクトの基準点に対する指定なので
たとえば枠からオブジェクトがはみ出さないようにドラッグしたい場合とかは
x,y,width,heightなどのプロパティの計算だけで処理しようとすると
基準点の位置によっては、ちょっとややこしくなります。
そんなときに「getBounds」
表示オブジェクトの存在領域を取得するためのメソッド「getBounds」を使い
オブジェクトの基準点の位置を割り出して可動範囲を調整します。
例えばステージの端からオブジェクトがはみださないようにするには
var objBounds:Rectangle = obj.getBounds(stage); var offSetX_fromBoundsLeft:Number = obj.x - objBounds.left; var offSetY_fromBoundsTop:Number = obj.y - objBounds.top; var draggableRect:Rectangle = new Rectangle( offSetX_fromBoundsLeft, offSetY_fromBoundsTop, stage.stageWidth - objBounds.width, stage.stageHeight - objBounds.height ); obj.startDrag(false, draggableRect);
という感じでしょうか。
基準点の位置や変形の状態によらずにうまいこと動いてくれています。
上記の方法はstageの端を壁にするような衝突判定にも使えますね。