2017-01-01 12 views
2

У меня есть сцена, включая все клипы, Sprites, графику, которую я привожу на сцену с помощью addChild (...).Как удалить все клипы, спрайты и графику со сцены в AS3?

Я хочу удалить все из них, потому что я все еще вижу их, когда иду в другие сцены.

Я использовал ниже код, но он показывает мне ошибку, упомянутых ниже:

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
    while (stage.numChildren > 0) 
    { 
    stage.removeChildAt(0); 
    } 

} 

Ошибка:

TypeError: Error # 1009: Не удается получить доступ к свойству или методу нулевой ссылки на объект. на Show_fla :: MainTimeline/remove()

Заранее благодарим за ваше время и помощь!

ответ

2

Как показывает, он не работает с в то время как петли и она работает с цикл |:

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
var i:int = 0; 
for (i=stage.numChildren-1; i>=0; i--) 
{ 
    stage.removeChildAt(i); 
} 
} 
1

DiaplayObject.stage свойство определяется только в то время как данный DisplayObject фактически присоединен к этапу. Как только вы удалите Sprite/MovieClip, в котором содержится код удаления, его .stage изменяет значение null и следующее условие check stage.numChildren, естественно, терпит неудачу. Вы должны сохранить ссылку на этап в локальной переменной.

btn.addEventListener(MouseEvent.CLICK,removing); 

function removing(e:MouseEvent):void 
{ 
    var aStage:Stage = stage; 

    while (aStage.numChildren > 0) 
    { 
    aStage.removeChildAt(0); 
    } 
} 
+0

Это избежать ошибки, но удалить объект [MainTimeline] тоже. Таким образом, после первого цикла детей больше нет. @Organis – tatactic

1

Если Вы добавляете след объекта, который вы удаляете, Вы увидите, что вы удалите [объект MainTimeline], поэтому Вам даже не нужен цикл.

В своем коде Вы удаляете [объект MainTimeline], и ​​все клипы удаляются. В цикле while он выдает ошибку не в цикле for.

function removing(e:MouseEvent):void { 
    var i:int = 0; 
    for (i=stage.numChildren-1; i>=0; i--) 
    { 
     trace("removing : " + (stage.getChildAt(i))); 
     stage.removeChildAt(i); 
    } 
} 

Выход:

removing : [object MainTimeline] 

Так вы удалите объект [объект MainTimeline] и не имеют больше детей, чтобы удалить.

function removing(e:MouseEvent):void { 
    trace("removing : " + (stage.getChildAt(0))); 
    stage.removeChildAt(0); 
} 

вероятно, даст вам тот же результат:

removing : [object MainTimeline] 

Так Вы даже не нужен цикл, если [объект MainTimeline] удаляется.

Я не тестировал его в тех же условиях, поэтому, пожалуйста, сообщите нам, если у вас такой же выход.

Я предлагаю вам проверить ответ от @LukeVanIn, объясняющий difference between stage, root and main timeline

[EDIT]

function removingWhile(e:MouseEvent):void { 
    while (stage.numChildren > 0){ 
    count++; 
    trace("removing : " + (stage.getChildAt(0))); 
    trace ("number of iterations = " + (count++).toString()) 
    stage.removeChildAt(0); 
    } 
} 

Выведет:

удаления: [объект MainTimeline] число итераций = 1

TypeError: Error # 1009 ... в Untitled_fla :: MainTimeline/removingWhile()

[/ EDIT]

+0

@ Maziar Я бы очень хотел знать, что будет выводить панель вывода в вашем случае. Я, вероятно, ошибаюсь, но это всегда полезно проверять код с помощью функции trace() или пытаться блокировать catch. – tatactic