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