【问题标题】:As3/Flash: how to get object from the designer stageAs3/Flash:如何从设计器阶段获取对象
【发布时间】:2014-09-07 20:35:28
【问题描述】:

我在获取放置在我的设计师中的物品时遇到问题。 我使用外部类,我链接到我在时间轴上放置在我的设计器中的对象。 我一直认为它们位于 as3 类的“stage”属性中。

但是当我这样做时:

trace(stage.getChildByName("thing"));

没有找到我在我的设计师中称为事物的项目。 它实际上返回 null。

有谁知道我需要针对什么属性来获取我已经放置在舞台上的项目。 然后动态添加所有项目,这将使一切变得容易得多。

【问题讨论】:

    标签: actionscript-3 flash movieclip stage


    【解决方案1】:

    如果没记错的话,编辑器中舞台上的对象是root 的子对象,而不是stage

    如果您的代码在时间轴或文档类上,则以下内容应该有效。

    this.getChildByName("thing");
    

    如果您尝试从另一个对象访问它,以下应该可以工作。

    (root as DisplayObjectContainer).getChildByName("thing");
    

    【讨论】:

    • 非常感谢这解决了我的问题,我试着查看根目录。我知道它存在,但因为它没有 getChildByName 属性,所以我不再看它。您必须将其转换为 DisplayObjectContainer 才能使其工作,这是非常愚蠢的。谢谢:)
    【解决方案2】:

    我的对象的父级

    对于名为s 并放置在您的Stage 上的实例,或者由以下示例中的代码调用,您只需跟踪它的parent 即可知道您应该在点之前写什么。您的对象的父对象在您的点之前:

    var s:Square = new Square();
    addChild(s);
    trace(s.parent); // [object MainTimeline]
    trace(s.parent.parent); // [object Stage]
    

    这意味着你的对象被放置在你的MainTimeline上,它本身被放置在它的Stage上。

    要引用DisplayObjectStage 对象,您只需使用它的stage 属性:

    trace('s Stage   ' + s.stage); // s Stage   [object Stage]
    trace('this Stage   ' + this.stage); // this Stage   [object Stage]
    

    通过使用关键字this,您指的是您的主时间线:

    trace(this is MainTimeline); // true
    

    然后调用你的对象你可以写:

    trace(s); // [object Square]
    // or
    trace(this.s); // [object Square]
    

    我应该使用 getChildByName 方法吗?

    您不需要使用getChildByName 方法来调用对象。你可以直接用它的名字来称呼它。为什么在不需要的时候使用方法?

    var s1:Square = new Square();
    trace(s1); // [object Square]
    this.addChild(s1);
    
    s1.name = 'Square1';
    trace(this.getChildByName("Square1")); // [object Square] 
    

    不同之处在于,如果您的对象尚未通过addChild 方法添加到显示列表中,getChildByName 将返回null

    但是,如果您必须绝对通过方法调用 DisplayObjects 的实例,请使用 getChildAt 方法通过它们的索引调用它们,而不是使用 getChildByName 方法通过它们的名称调用它们。

    trace(this.getChildAt(0)); // [object Square] 
    

    您不应该使用比getChildAt 方法慢的getChildByName 方法。可以用下面的代码比较这两种方法的速度:

    // testing getChildByName
    var sta:Number = getTimer();
    for (var i:int = 0; i < 5000000; i++) {
        getChildByName('Square1');
    }
    var sto:Number = getTimer();
    trace((sto - sta) + ' ms'); // 2299 ms
    
    // testing getChildAt
    var sta:Number = getTimer();
    for (var i:int = 0; i < 5000000; i++) {
        getChildAt(0);
    } 
    var sto:Number = getTimer();
    trace((sto - sta) + ' ms'); // 610 ms
    

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 2014-01-31
      • 2012-12-09
      • 2011-02-13
      • 2012-04-06
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多