NINJA编辑:出于某种原因,同样的代码现在可以工作,没有任何问题。我不知道发生了什么,也不知道为什么,但我不再有这个问题
以下是原始帖子:
简单地说,我创建了一个MovieClip,将其与addChild()一起放在舞台上,当我试图调用这段代码时:
MovieClip(root).someFunction();
它引发错误#1034:类型强制失败:无法转换flash。显示::Stage@4034f71至flash.display.MovieClip.
我真的不明白为什么这段代码不起作用。对象本身工作得很好,因为我可以调用其中的函数(那行代码实际上在函数中)。只是有问题的那段代码
有人能告诉我哪里出了问题吗?
编辑:为了更好地说明这种情况,下面是我的代码:
在电影剪辑中,我有这个功能:
function bombReset():void
{
bBombIsDropped = false;
tCarpetBombTween.gotoAndStop(0);
this.visible = false;
MovieClip(root).carpetBombAttack(iPosition);
}
在Scene1(根,最外层的父级)上,我有这样的功能:
function carpetBombAttack(position:int):void
{
damagePlant(15,vTileOccupant[(position-1)]);
}
如果我通过addChild创建一个MovieClip实例并在其中调用bombReset,Flash将抛出错误
如果我手动将MovieClip拖到舞台上,当我调用bombReset时,它将正常工作
您的错误意味着编译器不知道MovieClip
和Stage
是如何相同的。此外,我不确定,但我相信编译器会抱怨someFunction
不存在于舞台上,即使您正确地广播了stage
(又名根)。
解决这个问题的正确方法是为项目分配一个文档类,并使someFunction
成为一个公共方法(类函数)。
外行的解决方案(我有时会在懒惰时使用)是以下
Object(this.stage).someFunction();
这是因为类型转换this.stage
的方式会使编译器认为它是Object
而不是Stage
。Object
可以有任意数量的未记录的属性和函数,因此允许您调用Object
上的项,无论它们是否是类定义的一部分(甚至是不存在的项,这可能会给您自己带来麻烦)。
Stage
的继承是Stage -> DisplayObjectContainer -> InteractiveObject -> ...
,而MovieClip
是MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> ...
(我会直接链接到文档,但页面一直在崩溃)。
虽然它们共享公共基类,但Stage
和MovieClip
类实际上并不相关,因此尝试将其中一个强制转换为另一个将失败。
当您执行MovieClip(root)
类型转换而不是root as MovieClip
类型转换时,这就是您得到错误的原因。
直接将其强制转换为定义了someFunction()
的对象,使用Jackson定义的解决方案,或者如果您完全知道它在那里,也可以执行root["someFunction"]()