Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 选择";“最年轻的”;AS3中鼠标下的子对象(仅限目标)_Actionscript 3 - Fatal编程技术网

Actionscript 3 选择";“最年轻的”;AS3中鼠标下的子对象(仅限目标)

Actionscript 3 选择";“最年轻的”;AS3中鼠标下的子对象(仅限目标),actionscript-3,Actionscript 3,tldr: 如何告诉鼠标事件只为鼠标下最小的孩子而不是它的父母触发? 我只是在做一个纸牌游戏来更好地学习OOP。我有卡片课和卡片家庭课。每一张卡都包含一个可容纳一张卡的CardHome,依此类推。因此,移动一张卡将移动其中包含的所有卡。问题是我的鼠标事件正在检测所有卡的父卡。所以我想我需要的是一种方式,说“只为目标中最小的孩子运行这个鼠标事件”。有办法吗 private function pressCard(me:MouseEvent):void{ var c:Object =

tldr: 如何告诉鼠标事件只为鼠标下最小的孩子而不是它的父母触发?

我只是在做一个纸牌游戏来更好地学习OOP。我有卡片课和卡片家庭课。每一张卡都包含一个可容纳一张卡的CardHome,依此类推。因此,移动一张卡将移动其中包含的所有卡。问题是我的鼠标事件正在检测所有卡的父卡。所以我想我需要的是一种方式,说“只为目标中最小的孩子运行这个鼠标事件”。有办法吗

private function pressCard(me:MouseEvent):void{
        var c:Object = me.target as Card;
        // place card in center of container x wise
        c.x = 0;
        // and down 5
        c.y = 5;

        // bring drag container up to front z order
        addChild(c as Card);

        // begin dragging drag container
        c.startDrag(true);

        // hide mouse
        Mouse.hide();

        // add listener to this card for mouse up
        c.addEventListener(MouseEvent.MOUSE_UP,dropCard);
    }

    private function dropCard(me:MouseEvent):void{
        var c:Object = me.target as Card;

        // release drag container
        c.stopDrag();

        // remove mouse up listener from card
        c.removeEventListener(MouseEvent.MOUSE_UP,dropCard);
        Mouse.show();


        // check for colision with a card that has a matching holder
        for (var i:int = 0; i < deckArray.length; i++){
            if (c.hitTestObject(deckArray[i]) && c != deckArray[i]){
                trace("hit",deckArray[i]._containerOwned._occupied,deckArray[i]._flippable);
                if (deckArray[i]._number == c._number + 1 && deckArray[i]._flippable == false && deckArray[i]._suit != c._suit && deckArray[i]._containerOwned._occupied == false){ 
                    c._containedIn.parent._containerOwned._occupied = false;
                    makeFlippable(c._containedIn.parent);
                    deckArray[i]._containerOwned.addChild(c as Card);
                    c._containedIn = c.parent;                      
                    c.x = 0;
                    c.y = 0;
                    break;
                } 
            }
        }

        // add selected card back to home spot
        c._containedIn.addChild(c);
        c.x = 0;
        c.y = 0;
    }

    private function mOver(me:MouseEvent):void{
        trace(me.target._number);
        trace(getHighestZ());
    }

    private function getHighestZ():Card{
        var highestZ:int = 0;
        var c:Card;
        for (var i:int = 0; i < deckArray.length; i++){
            if (deckArray[i].hitTestPoint(stage.mouseX,stage.mouseY) && deckArray[i].getChildIndex() > highestZ){
                c = deckArray[i];
                highestZ = deckArray[i].getChildIndex();
            }
        }
        return c;
    }
专用功能压卡(me:MouseEvent):无效{
变量c:Object=me.target作为卡;
//将卡片按x方向放置在容器中心
c、 x=0;
//下降5
c、 y=5;
//按z顺序将拖动容器带到前面
addChild(c as卡);
//开始拖动容器
c、 startDrag(正确);
//隐藏鼠标
鼠标隐藏();
//将侦听器添加到此卡以进行鼠标悬停
c、 addEventListener(MouseEvent.MOUSE\u UP,dropCard);
}
专用功能dropCard(me:MouseeEvent):无效{
变量c:Object=me.target作为卡;
//释放拖曳容器
c、 停止拖动();
//将鼠标从卡中取出
c、 removeEventListener(MouseEvent.MOUSE_UP,dropCard);
Mouse.show();
//使用具有匹配支架的卡检查是否存在冲突
对于(变量i:int=0;ihighestZ){
c=阵列[i];
highestZ=deckArray[i].getChildIndex();
}
}
返回c;
}

每张卡片都是其上方卡片中容器的子容器。我希望能够选择一张卡并拖动它(及其子卡)。问题是,当我单击卡片B时,它会选择卡片E。因此,我需要的是在鼠标事件中选择最小的子对象,而不是它的父对象。有办法控制吗

我知道我能判断老鼠孩子是真是假。那很好。所有卡都必须设置为true,以便我可以独立于其父卡选择它们。我需要为我的活动做点什么吗?这是我一直不明白的

注意:我意识到鼠标悬停功能存在问题。修复这将是一件微不足道的事情,而且目前只是一个占位符。

tldr:

结合使用
useCapture
设置为
true
stopPropagation
方法。这允许用户单击某个元素,并仅为目标调用eventHandler,而不是为目标和阶段之间的任何元素调用eventHandler

所以这里的关键是访问as3事件流。当鼠标事件被触发时,它会从后台向上传播到可以接收该类型鼠标事件的所有对象。在这种情况下,卡的父母。然后它冒着气泡回到舞台上。因此,我需要将捕获设置设置为true,从而将使用事件处理程序的阶段切换到冒泡阶段(这会导致第一个元素实际调用函数作为实际目标),然后,不让事件传播回stage,而是调用stopPropagation方法。看起来像这样:

c.addEventListener(MouseEvent.MOUSE_OVER, mOver, true);
此处的
true
表示在从目标返回舞台的过程中对每个元素启动函数。然后在
mOver
功能期间,我执行以下操作:

stopPropagation();
trace(c._Number);
// and any other code to do on this target
这样可以防止事件通过鼠标下的其他卡向下流动

而不是像这样的输出

5
3
9
当鼠标在9卡上时(在3卡上,在5卡上),我现在得到的是简单的

9
然后当我把鼠标移到3上时,我得到

3
因此,现在鼠标仅为目标调用函数。令人惊讶的是,非直观,但允许一些严重的灵活性和控制

tldr:

结合使用
useCapture
设置为
true
stopPropagation
方法。这允许用户单击某个元素,并仅为目标调用eventHandler,而不是为目标和阶段之间的任何元素调用eventHandler

所以这里的关键是访问as3事件流。当鼠标事件被触发时,它会从后台向上传播到可以接收该类型鼠标事件的所有对象。在这种情况下,卡的父母。然后它冒着气泡回到舞台上。所以我需要的是将捕获设置设置为true,从而将使用事件处理程序的阶段切换到冒泡阶段(这会导致第一个元素实际调用t)