Не обязательно расширять main, чтобы создать что-то вроде класса bullet, это может быть собственный класс, который расширяет Sprite или MovieClip.Объект stage считается глобальным объектом, так как он является одноэлементным (за исключением случая Adobe AIR, где вы можете иметь один этап на NativeWindow, который вы создаете).Таким образом, любой объект, который расширяет DisplayObject или имеет DisplayObject в своей цепочке наследования, будет по умолчанию иметь ссылку на стадию через геттер, который заполняется автоматически при добавлении displayObject в список отображения.Это может произойти либо путем добавления клипа непосредственно к корневому объекту сцены, либо путем добавления клипа в качестве дочернего элемента другого клипа, который в конечном итоге подключается к сцене.Например:
var clip1:MovieClip = new MovieClip();
stage.addChild(clip1); //Clip 1 can now access the stage reference internally.
ver clip2:MovieClip = new MovieClip(); //Right now, clip2 cannot access the stage reference interally.
clip1.addChild(clip2); //Now clip2 can access the internal stage reference because it has been connected to the display list through clip1.
Другая ошибка, которую совершают люди, - это доступ к этапу в типизированном классе DisplayObject (например, в вашем основном классе) без предварительного подтверждения того, что сам объект был добавлен на этап.Вы делаете это, слушая событие Event.ADDED_TO_STAGE в конструкторе класса, например так:
public class Main extends MovieClip{
function Main(){
if(stage){
//The stage reference is present, so we're already added to the stage
init();
}else{
addEventListener(Event.ADDED_TO_STAGE, init);
}
var player = new Player();
var playerBullets = new playerBullet();
addChild(player.players);
}
private function init(e:Event = null)
{
trace("Added to stage, the stage reference is now populated and stage can be accessed");
}
}
Это может быть вашей проблемой, но трудно сказать, так как вы не указалилюбые ошибки.Тем не менее, это, вероятно, проблема или будет для вас, так как это довольно часто.Внутри метода init () вы можете установить флаг, чтобы при вызове внешним классом вашего метода Main.blah () вы могли убедиться, что ссылка на этап существует, прежде чем пытаться что-то добавить к этапу.Однако учтите, что в вашем основном классе вы просто говорите:
addChild (someChild);
или
this.addChild (someChild);
вы не добавляете этого дочернего элемента в рабочую область, а скорее в объект Main, который является объектом на основе MovieClip или Sprite, который автоматически присоединяется к рабочей области, когда вы устанавливаете его в качестве класса Document.Надеюсь, эта информация поможет.
Обновление
Чтобы объяснить список отображения немного подробнее:
Думайте обо всех ваших видеоклипах как о блюдах, а о сцене - как о столе.,Доступ к столу можно получить только из блюда, если блюдо размещено непосредственно на столе или если блюдо сложено поверх другого блюда, которое касается стола.Если у вас есть 10 тарелок, наложенных друг на друга, все они в конечном итоге касаются стола, соединяясь друг с другом.По сути, это визуализация списка отображения Flash.Вы ставите посуду на стол, используя addChild (блюдо).Если вы не поместили объект где-нибудь на стол и попытаетесь получить доступ к таблице из этого объекта, вы потерпите неудачу.Вы получаете ошибку «доступ к неопределенному», потому что вызываете метод «blah ()», который обращается к этапу (таблице) до того, как пуля (блюдо) была добавлена к этапу (таблице).Поэтому вы должны сначала либо добавить пулю на сцену, либо добавить ее к другому объекту, который уже был добавлен на сцену.Измените свой код следующим образом:
var myBullet:Bullet = new Bullet();
stage.addChild(myBullet);
//Or, if this class, assuming it's the player class, has already been added to the stage, just do this:
this.addChild(myBullet);
myBullet.blah();
Тем не менее, вы должны все еще иметь некоторую проверку ошибок в вашем методе "бла", чтобы убедиться, что этап доступен:
function blah(){
var someSprite = new someSprite();
if(stage){
Main.addChild(someSprite);
stage.addChild(someSprite);
root.addChild(someSprite);
}else{
trace("error, stage not present");
}
}
Однако выСледует также отметить, что добавление этого потомка в Main, затем stage, затем root в последовательности, это не дублирует объект someSprite.Когда вы добавляете экранный объект к новому родительскому объекту, объект автоматически извлекается из его текущего родителя и перемещается к новому.Таким образом, весь этот код в конечном итоге добавит someSprite в root, что, как я полагаю, не удастся, поскольку root - это не экранный объект, а глобальная ссылка, в основном используемая для доступа к глобальным объектам, таким как stage и объект Loader, используемый для загрузки SWF..