Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как удалить объект со сцены по окончанию Tween? (http://www.flasher.ru/forum/showthread.php?t=150069)

Lazura 05.02.2011 19:16

Как удалить объект со сцены по окончанию Tween?
 
Помогите, пожалуйста, новичку. Не получается удалить объект со сцены, в таком случае:
Код AS3:

var bar2:bar1=new bar1();
stage.addChild(bar2);
barX = new Tween(bar2,"x",Back.easeOut,2,100,1,true);
barX.addEventListener(TweenEvent.MOTION_FINISH,bbb);
 
function bbb(e:TweenEvent) {
        stage.removeChild(DisplayObject(bar2));
}

bar1 - это MovieClip экспортированный в Action Script.
Выдаёт ошибку
Код:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
        at flash.display::DisplayObjectContainer/removeChild()
        at array_remove_fla::MainTimeline/aaa()
        at flash.events::EventDispatcher/dispatchEventFunction()
        at flash.events::EventDispatcher/dispatchEvent()
        at fl.transitions::Tween/set time()
        at fl.transitions::Tween/nextFrame()
        at fl.transitions::Tween/onEnterFrame()

Колин Мук прочитан, форум обыскан, но решение не найдено, возможно из-за невнимательности. Не удаляет именно из-под функции твина. Как правильно прописать removeChild() в таком случае?
Удаления типа bar2.parent.removeChild(DisplayObject(bar2)) не работает и проверка с помощью contains() также.

i.o. 05.02.2011 19:38

Код AS3:

function bbb( e:TweenEvent ):void
{
    if( stage && stage.contains( bar2 as DisplayObject ) )
        stage.removeChild( bar2 as DisplayObject );
}


Lazura 05.02.2011 20:00

Спасибо, что откликнулись, но к сожалению не работает, ошибка та же.

iNils 05.02.2011 20:26

Что показывает?
Код AS3:

function bbb(e:TweenEvent) {
        trace (bar2);
}


Lazura 05.02.2011 20:34

i.o., прошу прощения этот вариант работает! Огромное спасибо за помощь!

Код AS3:

function bbb( e:TweenEvent ):void
{
    if( stage && stage.contains( bar2 as DisplayObject ) )
        stage.removeChild( bar2 as DisplayObject );
}

iNils, думаю в таком случае вопрос не актуален, но выдаёт [object bar1]

mikhailk 05.02.2011 20:48

Аварийное решение заключается в том, чтобы удалять объект из его родителя, не важно, кто это. Т.е., примерно так:

Код AS3:

function anyObjectRemover(obj:DisplayObject) : void
{
  var parentObj:DisplayObject = obj.parent as DisplayObject;
  parentObj.removeChild(obj);
}

Но вообще-то, я не советую так поступать.

i.o. 05.02.2011 22:41

Lazura, всегда пожалуйста ;)
mikhailk, а такое разве скомпилируется?

Psycho Tiger 05.02.2011 22:55

i.o., а почему такое не должно скомпилироваться?
Другое дело, что это бросит RTE =)

mikhailk 05.02.2011 22:59

ок, напутал с классом

вот рабочий код:

Код AS3:

package 
{
        import flash.display.*;
        import flash.events.*;
 
        public class Main extends Sprite
        {
 
                private var sprite1:Sprite;
                private var sprite2:Sprite;
                private var sprite3:Sprite;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        sprite1 = new Sprite();
                        setRandomRectangle(sprite1);
                        addChild(sprite1);
 
                        sprite2 = new Sprite();
                        setRandomRectangle(sprite2);
                        sprite1.addChild(sprite2);
 
                        sprite3 = new Sprite();
                        setRandomRectangle(sprite3);
                        sprite2.addChild(sprite3);
 
                        addEventListener(MouseEvent.CLICK, onMouseClick);
                }
 
                private function onMouseClick(e:MouseEvent) : void
                {
                        anyObjectRemover(sprite3);
                        anyObjectRemover(sprite2);
                        anyObjectRemover(sprite1);                       
                }
 
                private function anyObjectRemover(obj:Sprite) : void
                {
                        var parentObj:Sprite = obj.parent as Sprite;
                        parentObj.removeChild(obj);
                }
 
                private function setRandomRectangle(sprite:Sprite) : void
                {
                        sprite.graphics.beginFill(Math.random() * 10000000);
                        sprite.graphics.drawRect(Math.random() * 100, Math.random() * 100, Math.random() * 300, Math.random() * 300);
                        sprite.graphics.endFill();
                }
 
        }
 
}


i.o. 05.02.2011 23:03

Цитата:

i.o., а почему такое не должно скомпилироваться?
если мне не изменяет память, то потому что DisplayObject не имеет метода removeChild ;)
mikhailk, в принципе достаточно было указать DisplayObjectContainer. Однако не поленился целый пример написать :)


Часовой пояс GMT +4, время: 15:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.