2014-01-31 3 views
0

Я пытаюсь создать отдельный класс, который рисует прямоугольник и добавляет его на сцену, но проблема в том, когда я пытаюсь сделать это из самого класса, я ничего не получил на сцена.Добавление movieClip в сцену из дочернего класса

мои настройки следующим образом:

Main.fla, который имеет класс документ Main.as:

package 
{ 
import flash.display.Sprite; 
import Window; 
public class Main extends Sprite 
{ 

    public function Main():void 
    { 
     var newWindow:Window = new Window(); 

    } 

} 

} 

класс, где MovieClip isadded

package { 

import flash.display.MovieClip; 
import flash.display.Sprite; 

public class Window extends Sprite { 

    public function Window(x:Number= 0, y:Number= 0, width:Number = 100, height:Number=100,title:String="Window"):void { 
     var newWindow:MovieClip = new MovieClip(); 
     addChild(newWindow); 
     newWindow.graphics.beginFill(0xFF9966, 1); 
     newWindow.graphics.drawRect(x, y, width, height); 
     trace("Instance created");  
     } 
    } 
} 
+0

Я не вижу проблем с существующим в настоящее время кодом. Вы пытались добавить «newWindow» к сцене вместо «this» и не смогли? :) – Vesper

+0

, когда я пытаюсь добавить его на сцену, я получил следующую ошибку: 'TypeError: Error # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект.' – RootOfMinusOne

+0

Правильно, когда вы сначала создаете экземпляр класса, его 'stage 'Свойство равно null. Доступ к сцене имеет только класс документа. Вам лучше использовать 'this.addChild (xxx)' вместо добавления на сцену, потому что есть обстоятельства, когда ваш SWF может быть встроен в другой, и тогда вы все равно не получите подходящую сцену. Кроме того, добавление в 'this' поможет вам управлять своими окнами. – Vesper

ответ

0

Да, вы не может получить доступ stage из вновь созданного объекта, потому что он не знает о существовании сцены. Единственное, что вы можете добавить в него, - this. Но, когда вы правильно вставляете объекты в контейнеры, вы можете делать более мощные вещи в одно мгновение, например, перемещая сложное окно с помощью одного назначения свойств x и y контейнера. Итак, вам нужно сделать addChild(newWindow) в вашем основном классе.

package 
{ 
import flash.display.Sprite; 
import Window; 
public class Main extends Sprite 
{ 

    public function Main() 
    { 
     var newWindow:Window = new Window(); 
     addChild(newWindow); // THIS 
     // also here you can do "newWindow.x=100;" for example 
    } 

} 

} 
+0

он работал, когда я добавляю его из класса документа, но я немного путаюсь, хотя, когда я впервые добавил MovieClip из класса «Window», недавно созданный MovieClip не был добавлен в список отображения сцены? потому что он не отображается? Зачем? Я пытался использовать 'this', это не сработало. извините, если я могу показаться глупым, но я только начинаю учиться as3, так что медведь со мной – RootOfMinusOne

+0

Да, потому что вам сначала нужно добавить 'this' в список отображения сцены. См., Иерархия списка отображения начинается со сцены и гнездится так же глубоко, как вы ее создаете. В вашем случае это выглядит как 'stage -> newWindow (Window) -> newWindow (MovieClip)'. Смотрите, эти 'newWindow' - это два разных объекта. Вы завершили построение второй стрелки с помощью 'addChild (newWindow)' внутри конструктора класса 'Window', но пока первая стрелка не будет построена, прямоугольник' newWindow' не будет отображаться, потому что 'stage' не знает о новом созданных МС. – Vesper

+0

Я вижу, большое спасибо. – RootOfMinusOne

Смежные вопросы