我在库中有一个movieclip,它在文档类的actionscript中动态添加到舞台上。此动画片段包含许多子图像,这些图像是从原始位置直接从photoshop导入的(必须保留)。
我不想手动命名每个图像实例,因为有几十个。
我已经完成并手动将图像转换为符号,因为显然flash不会将“位图”对象识别为AS3中父级动画片段的子项(numChildren看不到位图,但它会看到符号)。
我有一个数组,里面装满了对几十个孩子的引用,然后我循环遍历它,检查点击时是否每个都在鼠标下面。但是,不知何故,它没有检测到我点击项目,除非我手动命名子符号(我通过手动命名其中一些来测试 - 那些点击敏感。)
我已经在整个代码中进行了trace()
调试,验证我的数组是否充满数据,数据实际上是实例的名称(自动命名为IE instance45,instance46,instance47) ,等等,验证函数是否在点击运行,如果我手动命名符号,验证代码是否正常工作。
任何人都可以看到出了什么问题,或者我无法理解闪光的哪个方面?
以下是代码:
//check each animal to see if it was clicked on
private function check_animal_hits():void
{
var i:int = 0;
var animal:Object = this.animal_container;
for (i=0; i<animal.mussels.length; i++)
{
if (this.instance_under_cursor(animal.mussels[i].name))
{
var animal_data = new Object();
animal_data.animal = "mussel";
this.send_data(animal_data);
}
}
}
以下是instance_under_cursor()
方法的代码:
// Used for finding out if a certain instance is underneath the cursor the instance name is a string
private function instance_under_cursor(instance_name)
{
var i:Number;
var pt:Point = new Point(mouseX,mouseY);
var objects:Array = stage.getObjectsUnderPoint(pt);
var buttons:Array = new Array ;
var o:DisplayObject;
var myMovieClip:MovieClip;
// add items under mouseclick to an array
for (i = 0; i < objects.length; i++)
{
o = objects[i];
while (! o.parent is MovieClip)
{
o = o.parent;
}
myMovieClip = o.parent as MovieClip;
buttons.push(myMovieClip.name);
}
if (buttons.indexOf(instance_name) >= 0)
{
return true;
}
return false;
}
我相信我已将其缩小为getObjectsUnderPoint()
未检测到对象的问题,除非他们是手动命名的。
答案 0 :(得分:0)
这是在鼠标指针下查找对象最奇怪的方式......有一个内置函数就是这样做的。但是,除此之外,您不应该依赖实例名称,因为它们不相关/可以仅出于历史原因进行更改/保留。使用此属性的代码是重构的主题。
然而,您观察到的可能是:当您在Flash CS中将图像放置在场景上时,Flash会尝试通过将它们全部缩小为具有位图填充的形状来优化它。一旦你将它们转换为符号,它将无法做到(因为它假设你想稍后使用它们),但它会创建Bitmpas而不是 - Bitmap不是交互式对象 - 即它不会注册鼠标事件 - 没有必要将它添加到getObjectsUnderPoint()返回的内容中。显然,你想要做的是让它们成为互动的东西 - 例如像Sprite。因此,您对作为MovieClip的父级的测试错过了这一点 - 因为父级不需要是MovieClip(可能是Sprite或SimpleButton或Loader)。
但是,如果你能解释一下你需要instance_under_cursor
函数的内容,那么可能有更好的方法来完成它的目的。