0

2 つのオブジェクトと 1 つのターゲットがあります。マウス キーが押されているときに 1 つのオブジェクトをドラッグし、マウス キーが押されたときにオブジェクトをドロップします。オブジェクトはターゲットの 1 つにあります。o2 がターゲットにあり、o1 をターゲットにドラッグすると、o1 がターゲットに移動しない代わりに、o2 がその場所に移動します。

誰かが私を助けることができますか?

 var t1:int=0; //target is empty

 o1.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
 o1.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

 function startDragging(evt:MouseEvent):void
 {
o1.startDrag();
if (o1.x == tar1.x && o1.y == tar1.y)
{
    t1 = 0;
}
}
function stopDragging(evt:MouseEvent ):void
  {
    if (tar1.hitTestObject(o1)  && t1 == 0)
    {
        o1.x = tar1.x;
        o1.y = tar1.y;
        o1.stopDrag();
        t1 = 1; //target is full
    }
        else
    {
        o1.x = 250;
        o1.y = 200;
        o1.stopDrag();
    }
        }

   o2.addEventListener(MouseEvent.MOUSE_DOWN, startDragging2);
   o2.addEventListener(MouseEvent.MOUSE_UP, stopDragging2);

   function startDragging2(evt:MouseEvent):void
    {
o2.startDrag();
if (o2.x == tar1.x && o2.y == tar1.y)
{
    t1 = 0;
}
}
function stopDragging2(evt:MouseEvent ):void
   {
    if (tar1.hitTestObject(o2)   && t1 == 0)
    {
        o2.x = tar1.x;
        o2.y = tar1.y;
        o2.stopDrag();
        t1 = 1;}
        else 
    {
        o2.x = 250;
        o2.y = 140;
        o2.stopDrag();
    }
        }           

ここに画像の説明を入力

4

1 に答える 1

1

トリックは、o2オブジェクトMouseEvent.ROLL_OVERがドラッグ中に最初のイベントをo1受け取り、次にMOUSE_UPイベントと を受け取ることですo1。次に、両方のイベント リスナーが別々にトリガーされます。最初のリスナーがアクティブになり、 「グローバル」変数をstopDraggingチェックし、それが 0 - OK であることを検出し、 over に設定され、次にトリガー、bamがゼロでないため、トリガーを分岐して開始位置に戻します。通常の解決策は、次のように、オブジェクトのリスナーを追加および削除し、イベントのプロパティを介してオブジェクトをアドレス指定することです。t1o1targetstopDragging2t1elseo2target

o1.addEventListener(MouseEvent.MOUSE_DOWN,startDragging);
o2.addEventListener(MouseEvent.MOUSE_DOWN,startDragging);
// note that listeners are not separate functions! We will
// be using event.target to check which object is being dragged
function startDragging(e:MouseEvent):void {
    e.target.removeEventListener(MouseEvent.MOUSE_DOWN,startDragging);
    // surprise! This object will not be moved via MOUSE_DOWN,
    // because it's already being moved
    e.target.addEventListener(
    e.target.startDrag(); // drag
} // no alteration to t1, as we don't really care if we're dragging 
// our object off target - yet
function stopDraggging(e:MouseEvent):void {
    e.target.stopDrag(); // stop dragging anyway
    e.target.removeEventListener(MouseEvent.MOUSE_UP,stopDragging);
    // and stop listening for mouse-ups
    if (e.target.hitTestObject(tar1)&& (t1==0)) {
        e.target.x=tar1.x;
        e.target.y=tar1.y;  
        t1=1; // target is full
        return; // emergency exit. We don't need to do more
    }
    // should you add more targets, you can put hitTest code here

    // if we reached this point, we don't hit any targets
    // so we should put our objects back into their positions. 
    // The best way would be storing their base coordinates on 
    // objects themselves, so we don't have to run elsewhere for them
    e.target.x=e.target.startingX; // make sure these are filled
    e.target.y=e.target.startingY;
    e.target.addEventListener(MouseEvent.MOUSE_DOWN,startDragging);
    // and enable this object to be dragged again.
}
于 2013-07-16T17:08:24.237 に答える