2010-03-19 131 views
1

我是ActionScript新手,对addchild函数的工作原理有点困惑。Actionscript 3 Sprite AddChild

我想画5个房子。每栋房屋都有屋顶和墙壁。每面墙都有一扇门和一扇窗户。 我有以下类和我这是怎么划分他们

class Main 
    class House 
    class Roof //a triangle 
    class Wall //a rectangle 
     class Door //a rectangle 
     class Window //a square 

林具有的类继承的麻烦。我不能让墙上的课程显示出一扇窗户和一扇门。 有人能指引我走向正确的方向吗?

更新: 这是我不明白的部分。 我怎么写它,以便它相对于墙壁绘制门窗? (使用墙的左上角为0,0;而不是屏幕)

回答

2

我希望这有助于

// MAIN FLA 
import House; 

var house:House = new House(); 
addChild(house); 


package { 
    import flash.display.Sprite; 
    import Roof; 
    import Wall; 

    public class House extends Sprite { 
     protected var wall:Wall; 
     protected var roof:Roof; 
     function House() { 
      wall = new Wall(); 
      roof = new Roof(); 

      this.addChild(roof); 
      this.addChild(wall); 

      // The wall should be below the roof 
      wall.y = roof.height + roof.y; 

     } 
    } 
} 

package { 
    import flash.display.Sprite; 

    public class Roof extends Sprite { 
     function Roof() { 

     } 
    } 
} 

package { 
    import flash.display.Sprite; 
    import Door; 

    public class Wall extends Sprite { 
     protected var door :Door; 
     function Wall() { 
      door = new Door(true); 
      this.addChild(door); 

      // Door is centered. 
      door.x = (this.width - door.width)/2; 

      // Door is flush with bottom of the wall. 
      door.y = this.height - door.height; 
     } 
    } 
} 

package { 
    import flash.display.Sprite; 
    import Windoe; 

    public class Door extends Sprite { 
     protected var win :Windoe; 
     function Door(hasWindow:Boolean = false) { 
      if(hasWindow) { 
       win = new Windoe(); 
       this.addChild(win); 

       // The window should be centered? 
       win.x = (this.width - win.width)/2; 
       win.y = 20; // Just a guess. 
      } 
     } 
    } 
} 

package { 
    import flash.display.Sprite; 

    // The word Window may be reserved, so using Windoe just to be safe 
    public class Windoe extends Sprite { 
     function Windoe() { 

     } 
    } 
} 
2

对象不会自动添加到显示列表(显示在屏幕上),要做到这一点,您可以使用addChild()addChildAt()(用于指定深度)。

你想要的这里大概是一些看起来像这样(如果你想单独班):

类窗/门/屋顶希望仅仅是精灵的构造函数:

package { 
    import flash.display.Sprite; 

    public class Window extends Sprite{ 
     public function Window() { 

     } 
    } 
} 

华尔街希望添加一些孩子。

package { 
    import flash.display.Sprite; 

    public class Wall extends Sprite { 

     private var door:Door; 
     private var window:Window; 

     public function Wall() { 
      //Instance the objects 
      //This creates a reference but they will not render on screen 
      door = new Door(); 
      window = new Window(); 

      //Position objects here 

      //Add them to displaylist 
      addChild(door); 
      addChild(window); 

     } 
    } 
} 

房子然后想要以相同的方式添加屋顶和墙壁。 请注意,因为您在本例中首先添加了门,所以如果有任何重叠,它将出现在窗口后面。 然后,您的主类将为5个House实例创建并使用addChild()。

+0

这是我不理解的部分。 我怎么写它,以便它相对于墙壁绘制门窗? (使用墙的左上角为0,0;而不是屏幕) – Amy 2010-03-19 15:10:06

+0

没有区别,但它可以帮助您更好地形象化,如果您使用this.addChild(door)和this.addChild(window) – Sandro 2010-03-19 16:43:21

+0

public function House(){addChild(roof); addChild(wall);} 这是正确的吗?我现在得到一个空白的屏幕。我认为这与订购有关。如此迷茫。 – Amy 2010-03-19 17:20:13

1

它不会是自动的每一个视觉的物品具有x和y cordinate和那里所有chilrens X,Y 0,0 cordinates从换句话说,父母开始,如果你把

门在:

door.x = 200; 
door.y = 100; 

你给它会继承其位置,所以如果你只是对子级的例子的窗口中添加门

door.addChild(window); 

窗口会坐在ontop的的任何儿童你仍然可以用它的x,y坐标移动它,但是它相对于那扇门,因为它的孩子。

+0

不应该是window.addChild(门); – Amy 2010-03-19 16:20:48

+0

如何为窗户添加门? :) – Sandro 2010-03-19 16:41:20

+0

我的意思是wall.addChild(门):) – Amy 2010-03-19 17:17:03