【问题标题】:Flash CS5 reference a display object from a class other than the document classFlash CS5 从文档类以外的类引用显示对象
【发布时间】:2011-10-15 12:23:10
【问题描述】:

我使用 Flash CS5 Professional 创建了一个元件,将其拖到舞台上,并为其命名为 GreenLight1。如果我想让它在文档类中可见,我可以简单地执行 GreenLight1.visible=true;当我测试文件时,它很好。只要我留在文档类中,我就可以继续前进,但现在我正试图转移到另一个类并遇到各种麻烦,只是试图让 Flash 允许我访问这个简单的对象。我要做的就是让这个 GreenLight1 在这个新类中发生某种情况时不可见(visible=false),而 Flash 根本不允许我访问 GreenLight1。

到目前为止我尝试过的事情:

  1. stage 被传递给类并由 _stage 引用,并且在我执行 _stage.addchild 或类似的操作时工作得很好。所以我试过“_stage.GreenLight1.visible=false;”我得到“ReferenceError: Error #1069: Property GreenLight1 not found on flash.display.Stage and there is no default value.”

  2. 我的文档类扩展了 Sprite,所以我想试试 root 函数。所以我尝试了“Sprite(root).GreenLight1.visible=false;”我得到“1119:通过静态类型 flash.display:Sprite 的引用访问可能未定义的属性 GreenLight1。”

  3. 最后,根据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的源符号。我已选中“导出 ActionScript”,并且基类称为 GreenLight。这就是它的来源。我应该在某处或类似的地方制作“新绿灯”吗?我试图从中访问它的类我正在使用“Resource.GL1.visible=false;”,但它从来没有真正担心过这一点,因为我得到了上面 #3 中列出的编译错误。

无论如何,我不知道下一步该尝试什么。那么......我到底如何获得一个不是文档类来识别 GreenLight1 的类?

【问题讨论】:

    标签: flash actionscript-3 flash-cs5


    【解决方案1】:

    1 不起作用,因为对象的stage 属性(假设它在显示器上)是舞台对象。默认情况下,您的文档类将是舞台的第一个子级,除非您使用setChildIndex(0)addChildAt(someObject,0) 在其中插入了一些东西。所以你应该可以通过文档类访问

    this.stage.getChildAt(0).GreenLight1;
    

    2 不起作用,因为您将根转换为 Sprite。它不是 Sprite,而是您的文档类,它是 Sprite 的后代,所以应该可以:

    this.root.GreenLight1
    

    我将跳过第三个并尝试提供更直接的解决方案。您的库中有这个符号,您已将其设置为“为 actionscript 导出”并为其指定了类名 GreenLight。好的开始。因此,现在您可以在代码中的任何位置执行以下操作:

    var myGreenLight:GreenLight = new GreenLight();
    

    它创建了对您的 GreenLight 符号的新实例的引用 (myGreenLight)。您现在可以使用

    将其附加到调用类的显示树
    addChild(myGreenLight);
    

    假设您正在编写代码的类本身就在舞台上,那么您的 GreenLight 实例应该是可见的。您还可以从舞台上的任何对象调用this.stage.addChild(myGreenLight);,将您的 GreenLight 实例直接附加到舞台上,如果这是您想要的。

    所以现在,终于到了真正的问题。您在名为GreenLight1 的舞台上有一个GreenLight 的实例。 (请注意,按照惯例,只有类名以大写字母开头,变量名和实例名应以小写字符开头)。您还有另一个类也在显示树上,您需要获得对舞台上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和2不起作用,因为没有我没有指定的文档类?在我的 .fla 中,我指定了文档类,这不是您所指的吗?为了使 1 或 2 起作用,我需要做什么? GreenLight1 已经是显示器堆叠顺序的一部分,必须有更直接的方式来访问它???
    • 对不起,我有点跳过了我脑海中的那些,让我给你一个更好的答案......
    • 修改了关于 1 和 2 的答案。希望对您有所帮助。
    • 如果失败了,您能否将您的文档类添加到您的问题中?
    • 美丽!!!只需在您的第一个参考中将阶段更改为 _stage 和 this._stage.getChildAt(0).GreenLight1.visible=false;工作完美!非常感谢......我整天都在做这件事,有一些应该简单但不起作用的东西真是令人沮丧。
    【解决方案2】:

    对于选项 3,Resource 类文档类(因此将扩展 Sprite 更改为 MovieClip)。因此它将能够访问放置在舞台上的任何实例。如果您仍然遇到错误,请仔细检查您确实命名了该实例,或者您在时间轴上没有多个关键帧,而该实例不在第一帧上。

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 2014-09-08
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多