2011-07-27 5 views
1

私は自分のドラッグ機能を使いたくないのです。誰もが、startDrag()同等のものを持っているライブラリを知っていますか?たとえば、四角形のボックスではなく、ドラッグ範囲の円形の半径を使用できますか?矩形以外の境界を持つstartDrag()に相当するAS3ライブラリ(つまり:循環)?

+0

円形のドラッグについては、次の質問と回答を参照してください。[MovieClipを円にドラッグする](http://stackoverflow.com/questions/6509716/constrain-movieclip-drag-to-a-circle/6510032#6510032) 。 –

答えて

1

- あなたがする必要がある何がある:

A)MOUSE_DOWN:通販開始位置。 Enter_frameを聞き始めます。

B)ENTER_FRAME:)POSを開始するには、マウスのマウス位置からの距離を確認してください(使用ピタゴラス

c)の距離が少ない

xよりD)MOUSE_UPである場合にのみ、あなたのオブジェクトを移動:を聞いて停止しますEnterframe

+0

ええ、これは私が "自分のロール"を意味するもので、私が取ったアプローチです。元の質問では、これをすでに行っていたライブラリを知っている人がいるかどうか尋ねました。私は少し質問を開いたままにしておきます。誰もこの組み込みのライブラリを持っていない場合は、私はあなたの答えを受け入れます。 –

0

いいえ、それを行うにはピクセル完全な衝突(この場合はマウスクリック)が必要です。本質的に、すべての表示オブジェクトは常にそれらに対して矩形の境界を持っています。あなたはこのような何かする必要があると思いますので、基本的には:

mySprite.addEventListener(MouseEvent.MOUSE_DOWN, mousedDown); 

function mousedDown(e:MouseEvent):void 
{ 
    //Draw my sprite to a bitmap, then check the bitmap colour at mouseX/mouseY 
    uint colour = myBitmap.getPixel32(mouseX, mouseY); 
    if(colour != TRANSPARENT){ 
     //We've actually clicked on the object, drag it 
     Sprite(e.currentTarget).startDrag(); 
    } 
} 

注これは単なる擬似コードであるが、あなたはUINT値透明のように起動したかを把握する必要がありますし、また、あなたがのために考慮する必要がありますここで、スプライトの原点はビットマップに描画するときです。あなたがスプライトを持っていて、その内容が内部にあるとすれば、適切に描画するためにスプライトの幅の0.5倍の負のXオフセットとYオフセットを持つMatrixオブジェクトを作成する必要があります。 (円形ドラッグエリアの場合)

+0

コメントありがとうございました。私は何を求めているのかはっきりしていないはずです。問題の境界は、オブジェクトのヒット領域を決定するためのものではありません(途中で自動的に行われます)。それは私がオブジェクトをドラッグできる場所の境界です!つまり、startDrag(lockCenter:Bool、bounds:Rect)です。境界を指定するときは、オブジェクトをドラッグできないRectを指定する必要があります(ドラッグを停止するだけです)。これは私が望むふるまいですが、輪郭線が四角形ではない円形の領域にしたいと考えています。それはまったく衝突する必要はありません。 –

+0

大丈夫よ、大変申し訳ありません。私が何かを考えたり見つけることができたら、私は新しい答えを投稿します。 –

1

単純な円形衝突検出ルーチンを使うことができます。これは、オブジェクトの半径とそれらの間の距離を使用してヒット領域を処理します。おそらく、あなたはonDragメソッドでこの計算を手動で行い、下で計算された循環境界との衝突時にドラッグを停止する必要があります。

 var deltax : Number = targetCentreCoord.x - hitTestCentreCoord.x; 
     var deltay : Number = targetCentreCoord.y - hitTestCentreCoord.y; 

     //works out if our circles are colliding, distance between the circles inc radius    
     if (((deltax * deltax) + (deltay * deltay)) <= ((((targetRadius) + (hitTargetRadius)) * ((targetRadius) + (hitTargetRadius))))) 
     { 
      Log.info("collision occured with " + candidate.name + " target coords " + targetCentreCoord + " candidate coords " + hitTestCentreCoord); 
      return true; 
     } 
     return false; 
+0

もう一度、申し訳ありませんが、この質問には衝突はありません。 –

+1

質問の境界線でヒットを検出するには、衝突検出を行う必要があります。次に、ドラッグを停止します。あなたの質問を誤解していない限り。 – serenskye

+0

怖いので、私は何かを打つことはありません。ドラッグの範囲を制限するだけです。 AS3はネイティブにこれを行いますが、円形のボックスではなく四角いバウンディングボックスのみです。ここでもまた、家庭での解決策ではなく、図書館を求める質問があります。自宅でのアプローチは簡単ですが、図書館がすべての辺のケースをキャッチするので、私は尋ねていました。 –

-1

これは、ENTER_FRAMEイベントなしで行うことができます。 MOUSE_DOWNリスナーを持ち、境界内に境界がある場合は MOUSE_MOVEリスナーを追加します。 また、MOUSE_MOVEリスナーを削除するには、MOUSE_UPリスナーを使用してください。

関連する問題