Actionscript 3 从动态MovieClip实例调用MovieClip(root)会产生错误1034
忍者编辑: 出于某种原因,相同的代码现在可以正常工作,没有任何问题。我不知道发生了什么,或者为什么,但我不再有这个问题 以下是原始帖子:Actionscript 3 从动态MovieClip实例调用MovieClip(root)会产生错误1034,actionscript-3,Actionscript 3,忍者编辑: 出于某种原因,相同的代码现在可以正常工作,没有任何问题。我不知道发生了什么,或者为什么,但我不再有这个问题 以下是原始帖子: 简单地说,我创建了一个MovieClip,将它与addChild()一起放到后台,当我试图调用这段代码时: MovieClip(root).someFunction(); 它抛出错误#1034:类型强制失败:无法转换闪存。显示::Stage@4034f71要闪烁.display.MovieClip 我真的不明白为什么这段代码不能工作。对象本身工作得很好,因
简单地说,我创建了一个MovieClip,将它与addChild()一起放到后台,当我试图调用这段代码时:
MovieClip(root).someFunction();
它抛出错误#1034:类型强制失败:无法转换闪存。显示::Stage@4034f71要闪烁.display.MovieClip
我真的不明白为什么这段代码不能工作。对象本身工作得很好,因为我可以调用其中的函数(这行代码实际上在一个函数中)。只是这段代码有问题
有人能告诉我哪里出了问题吗
编辑:
为了更好地说明这种情况,下面是我的几段代码:
在MovieClip中,我有以下功能:
function bombReset():void
{
bBombIsDropped = false;
tCarpetBombTween.gotoAndStop(0);
this.visible = false;
MovieClip(root).carpetBombAttack(iPosition);
}
function carpetBombAttack(position:int):void
{
damagePlant(15,vTileOccupant[(position-1)]);
}
在Scene1(根,最外层的父节点)上,我有一个函数:
function bombReset():void
{
bBombIsDropped = false;
tCarpetBombTween.gotoAndStop(0);
this.visible = false;
MovieClip(root).carpetBombAttack(iPosition);
}
function carpetBombAttack(position:int):void
{
damagePlant(15,vTileOccupant[(position-1)]);
}
如果我通过addChild创建MovieClip实例并在其中调用bombReset,Flash将抛出一个错误
如果我手动将MovieClip拖到stage上,当我调用bombReset时,它将正常工作您的错误意味着编译器不知道
MovieClip
和stage
是如何相同的。另外,我不确定,但我相信编译器会抱怨舞台上不存在的someFunction
,即使你正确地铸造了stage
(也称为root)
解决这个问题的正确方法是为项目分配一个文档类,并使someFunction
成为公共方法(class函数)
外行的解决方案(我有时在懒惰时使用)如下
Object(this.stage).someFunction();
这是因为您正在以某种方式键入
this.stage
,使编译器认为它是对象,而不是stage
Object
s可以有任意数量的未记录属性和函数,因此允许您调用Object
上的项,无论它们是否是类定义的一部分(甚至是不存在的项,这可能会让您陷入麻烦).阶段的继承是阶段->显示对象容器->交互对象->.
,MovieClip
是MovieClip->Sprite->显示对象容器->交互对象->.
(我会直接链接到文档,但页面不断崩溃)
虽然它们共享公共基类,Stage
和MovieClip
类实际上并不相关,因此尝试将一个类转换为另一个类将失败
当您执行MovieClip(root)
类型强制转换而不是root作为MovieClip
强制转换时,这就是您得到错误的原因
或者直接将其强制转换到定义了someFunction()
的对象,使用Jackson定义的解决方案,或者如果您完全知道它在那里,也可以执行root[“someFunction”]()
我手动添加了很多其他Movieclip(从库中拖动它们并给它们实例名),还有MovieClip(root)。有些函数代码工作得很好,这就是我感到困惑的原因。我会试试你的代码“someFunction”只是一个名字,函数实际上就在那里,我用同样的方式(MovieClip(root)。someFunction())从其他很多MovieClip中调用了同一个函数。顺便问一下,“root as MovieClip”和“MovieClip(root)”之间有什么区别?我想他们都是以“root”的方式键入对象的“作为一个电影演员?我认为MovieClip(root)只是MovieClip中root的较短方式。MovieClip(root)
如果root
不是MovieClip
,就会抛出一个错误,而root as MovieClip
只会给你null
。这是一种首选的铸造方法。MovieClip(root)
类型的铸造主要用于原语从一种类型铸造到另一种类型。例如:Number(“2”)
我还认为您遇到的问题是,根可以是stage
,但不一定总是stage
:-中定义的someFunction()
函数是什么类?someFunction()是一个简单的函数,我没有为此创建或使用任何自定义类。请参阅我在上面文章中的编辑,它可能更好地说明我的情况