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.currentTargettarget是最初分派事件的对象,并且currentTarget是分派它的最新对象(通常是您的侦听器附加到的对象)。

快速概述。假设 obj2 被舞台上的 obj1 包裹。快速层次结构:

-Stage
--obj1
---obj2

如果您要在 obj2 中触发一个事件(冒泡,这很重要,因为它允许事件通过其父级,直到它到达事件处理程序。我相信所有MouseEvent的 s 都这样做)并且有一个附加到 Stage 的侦听器,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 == mySprite确定它是否也发生在 mySprite 上。

不过,这里有一个警告。如果您的 Sprite 有孩子,则其中一个孩子将成为目标。但是,如果您设置mySprite.mouseChildren = false,它将不会在子级上注册鼠标事件,这意味着它将像上面的示例一样运行。

希望这会有所帮助

于 2013-07-12T21:22:43.827 回答