0

私は ActionScript 3 を学んでおり、現時点ではhttp://www.senocular.com/flash/tutorials/as3withmxmlc/のチュートリアルに従っています。ステージ上にボールを置き、ユーザーがそれをドラッグできるようにする簡単なアプリケーションについて説明します。ただし、特にユーザーがポインターをステージからドラッグした場合を処理しないため、バグがあります。これにより、ケースを処理するためのより良い方法について考えるようになりました。手始めに、MOUSE_UP イベントの処理方法を検討しています。次のように書きたいと思います。

public class Test extends Sprite
{
    public function Test(stage:Stage)
    {
        mySprite = SomeSpriteClass()
        stage.addEventListener(MouseEvent.MOUSE_UP, handleStageMouseUp);
        mySprite.addEventListener(MouseEvent.MOUSE_UP, handleSpriteMouseUp);
    }

    private function handleStageMouseUp(event:MouseEvent):void {
        // how do I determine here if there was also a MOUSE_UP on the Sprite?
        // Perhaps I could check the click coordinates of 'event' to see if 
        // they are superimposed on the Sprite.         

    }

    private function handleSpriteMouseUp(event:MouseEvent):void {
        // I don't need this method if I can handle all cases in the 
        // method above.
    }
}

発生するこの問題は、ActionScript3 が使用するイベント モデルでは、イベントの組み合わせを含むケースを探す方法がわからないということです。または、上記の handleStageMouseUp() のコメントに書いたように、「mySprite」でマウス イベントが発生するかどうかを確認できます (どうすればよいでしょうか?)

私が本当にやりたいことは、すべてのケース ロジックを次のように結合できるようにすることです。

private function handleAllCases(...):void {
    if (..mouse up on stage but not sprite..) {
        .. handle case ..;
    } else if ( .. mouse up on both stage and sprite .. ) {
        .. handle case .. ;             
    }
}

これを行う方法、またはそれについて考えるより良い方法はありますか?

4

1 に答える 1

1

と をチェックEvent.targetEvent.currentTargetます。target最初にイベントをディスパッチしたオブジェクトであり、currentTargetそれをディスパッチする最新のオブジェクトです (通常、リスナーがアタッチされているオブジェクト)。

その概要を簡単に説明します。ステージ上にある obj1 によって obj2 がラップされているとします。クイック階層:

-Stage
--obj1
---obj2

obj2でイベント (バブル、イベントがイベント ハンドラーに到達するまで親を通過できるため、これは重要です。すべてMouseEventの s がこれを行うと信じています) をトリガーし、ステージにリスナーがアタッチされている場合、obj2 は次のようになります。がターゲットになり、Stage が currentTarget になります。

では、これはどのように機能しますか? イベントの開始場所と現在の場所を特定するには、target と currentTarget を確認する必要があります。

これを Flash にプラグインし、オブジェクトをクリックしてさまざまな場所でリリースし、コンソールを見てください (私はこれをテストしました)。

import flash.display.*;
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x000000);
mySprite.graphics.drawRect(0,0,100,100);
mySprite.graphics.endFill();
addChild( mySprite);
stage.addEventListener(MouseEvent.MOUSE_UP, handleStageMouseUp);

function handleStageMouseUp(e:MouseEvent):void {     
    trace( "handleStageMouseUp - target == stage: " + (e.target == this.stage) );
    trace( "handleStageMouseUp - target == mySprite: " + (e.target == mySprite) );
    trace( "handleStageMouseUp - currentTarget == stage: " + (e.currentTarget == this.stage) );
    trace( "handleStageMouseUp - currentTarget == mySprite: " + (e.currentTarget == mySprite) );
    trace( "--------" );
}

ほとんどの場合、stageUp ハンドラーで、e.target == mySpritemySprite にも発生したかどうかを判断するかどうかを確認できます。

ただし、ここで注意点があります。スプライトに子がいる場合、それらの子の 1 つがターゲットになります。ただし、 を設定mySprite.mouseChildren = falseすると、子にマウス イベントが登録されないため、上記の例のように動作します。

うまくいけば、それは役に立ちます

于 2013-07-12T21:22:43.827 に答える