2011-03-16 79 views
1

我有在AS3文件这和舞台在AS3

区分这时候有点混乱可以说,我有一个链接到一个Main.as

一个主舞台,然后什么

之间的differenence

this.addChild()
stage.addChild()

还什么类型的对象是 “本”

可以说我创建一个类,并通过在“当前”,所以我可以指从MC内部到阶段

变种MC一个实例:DERP =新DERP(本)

里面的derp是什么?它是类型的通用对象吗?

回答

9

类的内部成员this引用当前实例的成员函数被调用(所以它总是与类相同的类型)。例如,如果你有一个类鼻音与成员函数func

var twang1:Twang = new Twang(); 
twang1.func();  // Inside func(), "this" will refer to twang1 

闪存首先创建在其上的一切必须被放置(直接或间接)(类型Stage的)阶段。然后,它实例化你的文档类的一个实例,并把它放在舞台上作为一个孩子。因此,您的代码中的this永远不会指向舞台,因为您没有编写Stage类。

由于显示树在Flash中是分层结构的,因此当您向舞台上已有的子对象(至少间接)添加内容时,它将出现在屏幕上。因此,this.addChild()stage.addChild()之间的区别是对象最终将插入哪个容器。

当将this传递给另一个对象的构造函数时,它将是定义方法(使用this)的类的类型;所以在这种情况下,它将是文档类的类型。

不是传递的显示对象容器的其他对象,以便为他们的孩子加入到它,你可以有你的类从雪碧(或其他一些DisplayObjectContainer)继承并添加子自己。然后,您可以将您创建的对象(其中包含子对象)添加到您自己(文档类实例)中,该对象位于舞台上。这也提供了更好的封装。

还要注意的是,如果您想直接将孩子添加到舞台上,则无需将舞台传递给这些对象;他们已经有一个stage财产只是为了这个目的。关于该属性的唯一棘手的事情是,直到该对象实际添加到舞台上才为空;所以,你需要一个事件侦听器:

public class Car : Sprite { 
    public Car() { 
     this.addChild(new Wheel()); // Add to self 

     this.addEventListener(event.ADDED_TO_STAGE, populateStage); 
    } 

    private function populateStage():void { 
     stage.addChild(new RandomThingToAddToStage()); 
    } 
} 

最后要注意,你不需要指定在大多数情况下this。以下两行是相同的(在一个类的方法中):

addChild(foo); 
this.addChild(foo); 
+0

好吧,让我直接得到这个: – Saad 2011-03-17 04:58:49

+0

@Saad:是吗? (我写这个答案,而睡眠剥夺BTW,所以一些地方可能不太清楚) – Cameron 2011-03-17 05:02:54

+0

@Cameron OK,让我得到这个直:首先 我们 主要>>阶段(隐含的) 那么如果我们去 foo = new Foo() adChild(foo); 我们 主要>> >>舞台富 和内部FOO我有 foobar的=新FooBar的() 的addChild(foobar的); 我们有 主>>舞台>> foo >> foobar 但是如果我想在舞台下添加foobar,基本上我们的main.as但是在foobar里面(我不需要将这个实例传入foo叫它x,然后去:x.addChild(foobar)? – Saad 2011-03-17 05:10:20

2

下面是文档类的例子:使用上面的例子

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main() 
     { 
      this.addChild(new Sprite()); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     }// end function 

     public function onAddedToStage(e:Event):void 
     { 
      stage.addChild(new Sprite()); 

     }// end function 

    }// end class 

}// end package 

,所述this关键字指向当前实例,在此,这将是该Main显示对象(没有双关语意)的情况下。当您对此调用addChild()方法时,您正在调用Main显示对象上的addChild()方法。此时,添加新的Sprite实例时,将其添加到Main显示对象或换句话说this显示对象。

stage另一方面是Main的公共财产,它存储对舞台的引用。当您使用舞台参考的addChild()方法添加Sprite的新实例时,将该实例添加到舞台而不是Main显示对象。

简单地说就是Main是舞台的小孩展示对象。所以当你做stage.addChild(new Sprite())时,舞台现在有两个子对象,新的Sprite实例和Main。但是,当您从Main类中执行this.addChild(new Sprite())时,您指的是Main。所以现在舞台有一个子显示对象Main,而Main具有Sprite的新实例作为子显示对象。

+0

do main和stage是否共享相同的直角坐标? stage.MC.x == Main.Mc.x – Saad 2011-03-16 05:31:59

+0

不,至少我不这么认为,那真是另一个问题。你从我的回答中得到了'this'和'stage'之间的区别吗? – Taurayi 2011-03-16 05:51:04

+0

+1,这真的强调阶段和文档类之间的区别 – Cameron 2011-03-17 05:34:21