大家好,所以我有一个名为popEffect
的影片剪辑,我希望在鼠标点击的当前bubbles
上显示。现在,每当我点击一个Bubble一切正常时,它们就会从舞台上删除,但我遇到的问题是popEffect
没有定位到被点击的当前bubbles
。相反,它们位于显示对象数组中屏幕上显示的不同气泡。
以下是我完成所有设置的方法:
private function addBubbles(e:TimerEvent):void
{
bubbles = new mcBubbles();
stage.addChild(bubbles);
aBubbleArray.push(bubbles);
bubbles.addEventListener(MouseEvent.CLICK, bubblesBeingClicked);
}
然后是BubblesBeingClicked函数:
private function bubblesBeingClicked(e:MouseEvent):void
{
var BubblePop:DisplayObject = e.target as DisplayObject; // HERE is your clicked square
var i:int = aBubbleArray.indexOf(BubblePop); // and HERE is your index in the array
if (i < 0)
{
// the MC is out of the array
//trace("Pop Clicked");
onBubbleIsClicked(BubblePop);
aBubbleArray.splice(i, 1);
BubblePop.parent.removeChild(BubblePop);
//Remove Listeners!!!
BubblePop.removeEventListener(MouseEvent.MOUSE_DOWN, onBubbleIsClicked);
// Null
BubblePop = null;
}
}
最后我的onBubbleIsClicked函数,其中popEffect
位于:
private function onBubbleIsClicked(bubblePop:DisplayObject):void
{
nScore++;
updateHighScore();
//Pop Effect
popEffect = new mcBubblePop();
stage.addChild(popEffect);
popEffect.x = bubbles.x;
popEffect.y = bubbles.y;
}
任何人都可以看到为什么popEffect
不会对当前正在弹出的泡泡定位?它的表现非常奇怪。
答案 0 :(得分:1)
原因是:
popEffect.x = bubbles.x;
popEffect.y = bubbles.y;
据我所知,bubbles
是班级中的成员变量(您在addBubbles
函数中使用它。在onBubbleIsClicked
内,您提供bubblePop
但是不要使用它。你正在使用bubbles
,这实际上是你在tick函数中创建的最后一个实例!
因此,每次创建popEffect
时,您实际上都会将x
和y
分配给最新创建的bubblePop
。
有人建议:
不要经常使用成员变量。它们用于 WHEN ,您需要在函数之间使用变量。在您的情况下,bubbles
是一个在创建函数中仅使用 的变量。你甚至把它们放入一个阵列!并且因为每次创建实例时都使用新的覆盖它,所以成员变量只保存最后一个。这真的需要吗?与popEffect
相同,是否有其他人使用它,因为它只是最后一个?正如你所看到的那样,这些事情会产生错误。
我真的不明白这意味着什么:if (i < 0)
。您搜索您单击的对象是否不在数组中?好吧,如果不是(怎么样?!),那么aBubbleArray.splice(i, 1);
的含义是什么?自i < 0
以来,您实际上拼接了负值,因此您拼接了一些其他元素!按逻辑计划你想做的事情,然后做实际的代码。如果对象不在数组中,那么为什么要从数组中删除任何内容?
更好地开始格式化代码。阅读有关驼峰案例和变量范围的内容。
尝试更好地管理您的逻辑。例如,这是非常尴尬的:BubblePop.parent.removeChild(BubblePop);
,只要您使用stage.addChild(bubbles);
添加它即可。那么使用stage.removeChild(child);
是不是更简单?编程中有一些规则(特别是在Flash中),比如“添加它应该删除它的内容”。这样可以保证您将来的安全。