使用Flash CS5 Professional我创建了一个符号,将其拖到舞台上,并为其指定实例名称GreenLight1。如果我想从文档类中看到它,我可以简单地执行GreenLight1.visible = true;当我测试文件时,它很好用。只要我留在文档类中我就可以了,但是现在我正在尝试移动到另一个类并且遇到各种麻烦只是试图让Flash允许我访问这个简单的对象。我想要做的就是让这个GreenLight1在这个新类中出现某种情况时变得不可见(可见=假),Flash根本不会让我访问GreenLight1。
到目前为止我尝试过的事情:
阶段被传递给类并由_stage引用,当我执行_stage.addchild或类似的事情时,它正常工作。所以我试过“_stage.GreenLight1.visible = false;”我得到“ReferenceError:错误#1069:在flash.display.Stage上找不到属性GreenLight1,没有默认值。”
我的文档类扩展了Sprite,所以我想我会尝试root函数。所以我尝试了“Sprite(root).GreenLight1.visible = false;”我得到“1119:通过静态类型flash.display:Sprite的引用访问可能未定义的属性GreenLight1。”
最后根据this thread中答案的建议,我尝试按照其中的描述创建Resource类。我遇到了同样的问题,因为它不知道GreenLight1的开头是什么,所以我得到了“1120:访问未定义的属性GreenLight1”。这是我的Resource.as代码(我应该从文档类传递给这个类吗?):
`
package {
import flash.events.Event;
import flash.display.Sprite;
import flash.display.DisplayObject;
public class Resource extends Sprite {
public static var GL1:GreenLight;
public function Resource() {
addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
}
private function init(e:Event):void{
Resource.GL1 = GreenLight1;
}
}
}
“GreenLight”类型来自GreenLight1的源符号。我已选中“Export for ActionScript”,基类称为GreenLight。这就是来自哪里。我应该在某个地方制作一个“新的GreenLight”或类似的东西?我正在尝试访问它的类我正在使用“Resource.GL1.visible = false;”,但它从来没有真正担心,因为我得到上面#3中列出的编译错误。
无论如何,我不知道下一步该尝试什么。那么......我如何获得一个不是文档类的类来识别GreenLight1?
答案 0 :(得分:2)
1 不起作用,因为对象的stage
属性(假设它在显示器上)是Stage对象。默认情况下,您的文档类将是该阶段的第一个子项,除非您使用setChildIndex(0)
或addChildAt(someObject,0)
在其中插入了一些内容。因此,您应该能够通过文档类访问
this.stage.getChildAt(0).GreenLight1;
2 不起作用,因为您将根作为Sprite进行投射。它不是Sprite,它是你的文档类,是Sprite的后代,所以这应该有效:
this.root.GreenLight1
我将跳过三号并尝试提供更直接的解决方案。您在库中有此符号,您已将其设置为“Export for actionscript”并为其指定了GreenLight
的类名。好的开始。因此,现在代码中的任何位置都可以执行以下操作:
var myGreenLight:GreenLight = new GreenLight();
已为GreenLight符号的新实例创建了引用(myGreenLight
)。您现在可以使用
addChild(myGreenLight);
假设您编写的类本身就在舞台上,那么您的GreenLight实例应该是可见的。您也可以从舞台上的任何对象调用this.stage.addChild(myGreenLight);
将GreenLight实例直接附加到舞台上,如果这是您想要的。
所以现在,终于到了真正的问题。您在GreenLight
的舞台上有GreenLight1
的实例。 (请注意,按照惯例,只有类名以大写字母开头,变量名和实例名应以小写字母开头)。您还有另一个类也在显示树上,您需要获得对舞台上GreenLight1
的引用。这是一个功能:
function getMovieClip($instanceName:String,$scope:DisplayObjectContainer):DisplayObject
{
var child:DisplayObject;
var loopLength:int = $scope.numChildren;
for(var i:int = 0; i < loopLength; i++) {
child = $scope.getChildAt(i);
if(child.name == $instanceName) return child;
}
//didn't find it
return null;
}
并且您可以从任何可以访问这样的阶段的对象中使用它:
var greenLightRef:GreenLight = getMovieClip('GreenLight1',this.stage) as GreenLight;
答案 1 :(得分:0)
对于选项3,资源类 是文档类(因此将扩展Sprite更改为MovieClip)。因此,它将能够访问放置在舞台上的任何实例。如果仍然出现错误,请仔细检查您是否确实命名了实例,或者在时间轴上没有多个关键帧且实例不在第一帧上。