Форум 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. Однако не поленился целый пример написать :)

Psycho Tiger 05.02.2011 23:05

mikhailk, всё чуточку проще.
DisplayObject#parent имеет тип DisplayObjectContainer, в котором уже определен метод removeChild.
Достаточно написать так:
Код AS3:

var parent:DisplayObjectContainer=object.parent;
if (parent) parent.removeChild(object);


mikhailk 05.02.2011 23:07

ну да, не имеет ))

@Psycho Tiger
да, так проще

хотя, мне кажется, что если автор приложения не знает, откуда удаляет свои объекты, это не есть гут ))

i.o. 05.02.2011 23:08

А я бы вообще так написал:
Код AS3:

if( obj && obj.parent )
    obj.parent.removeChild( obj );

Вот такое никогда ошибок не выкинет. Только если не фатально болен сам плеер ...

Psycho Tiger 05.02.2011 23:24

Выкинет, если obj.parent подписан на Event.REMOVED и выкидывает в хэндлере исключение =)

Вообще даже в таких случаях я не ленюсь создать событие с bubbles=true, type="removeMe!!!", которое ловил бы ответственный сверху.

i.o. 05.02.2011 23:25

Цитата:

Выкинет, если obj.parent подписан на Event.REMOVED и выкидывает в хэндлере исключение =)
можно с примером? )

Psycho Tiger 05.02.2011 23:45

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Jigsaw extends Sprite
        {
 
                public function Jigsaw()
                {
                        super();
                        var p:Sprite = new Sprite();
                        p.addEventListener(Event.REMOVED, handler);
                        var c:Sprite = new Sprite();
                        p.addChild(c);
 
                        c.parent.removeChild(c);
                }
 
                private function handler(event:Event):void {
                        throw new Error();
                }
        }
 
}

Я прикалываюсь просто )

i.o. 05.02.2011 23:48

не, ну это уже перебор)

mikhailk 05.02.2011 23:53

сорри за вопрос не по теме, а зачем тут super()?

i.o. 05.02.2011 23:59

вызвать конструктор суперкласса Sprite, если нет уверенности вызывается он по-дефолту до или после конструктора класса-наследника..

Psycho Tiger 06.02.2011 00:06

super, в случае его явного отсутствия в коде, всегда вызывается перед началом исполнения конструктора (т.е. вставляется первой строчкой конструктор).
Писать super() — это хороший тон и всё такое )

iNils 06.02.2011 00:09

Цитата:

Сообщение от i.o. (Сообщение 970762)
вызвать конструктор суперкласса Sprite, если нет уверенности вызывается он по-дефолту до или после конструктора класса-наследника..

Конструктор супер класса всегда вызывается до любой строчки кода в конструкторе наследника, если не указано обратное.

Просто кто-то решил, что это якобы "хороший тон", хотя на самом деле к тону это никак не относится. Просто люди выдают свои личные предпочтения за "хороший тон".

Psycho Tiger 06.02.2011 00:20

@iNils, Отрицать конвенцию это точно не хороший тон.
Цитата:

Constructors

If a classes has instance members, write a constructor, and make it explicitly call super(), even if it does nothing else
Нетрудно догадаться, что в случае любых классов, которые имеют экземпляры следует писать super().

mikhailk 06.02.2011 00:20

Я так понимаю, без супера не обойтись, если необходимо вызвать конструктор супер класса с параметрами. Без параметров есть он или нет ни на что не влияет.

ок, ответ я получил.

iNils 06.02.2011 00:39

Цитата:

@iNils, Отрицать конвенцию это точно не хороший тон.
Забудь про нее.
Цитата:

Конвенция — (лат. conventio — договор, соглашение) — разновидность международного договора, в котором прописанные нормы являются юридически-обязующими для сторон, подписавших эту конвенцию.
Ты ее подписывал? Я нет, и не собираюсь. Она абсурдна и пытается навязать абсолютно все, даже где мне ставить пробелы. И и это при том, что родной адобовский автоформат в Flash IDE, плевать на нее хотел. Ее не разу уже разбирали и у нас, и на руФлеше и всегда все возмущались тем или иным пунктом.
Чем больше правил, тем чаще их нарушают. Описывать нужно только ключевые моменты.

Например. Название класса пишется с большой буквы. Это важный момент, так как помогает понять любому в чужом коде, что это класс.
Описывать массив как [ 1, 2, 3 ], а не [1, 2, 3] или [1,2,3]. Извини, это бред. Всем и так понятно, что в обоих случаях это массив.

Psycho Tiger 06.02.2011 01:10

Я когда-то был за её незыблемость?
Конечно, что-то из конвенции для меня кажется неправильным. И конечно, я делаю так, как удобно мне. Но именно конвенция должна лежать в основе кода.
Если не будет фундамента — то точно придёт кто-то и скажет: "будем писать классы с маленькой, а переменные с большой!".
Если есть какие-то аргументы (вплоть до не нравится), то от конвенции можно отступать. Если таких аргументов нету, то отступать не нужно. У тебя есть аргументы против написания пустого super() или что-то, что выдаст в этом дурной тон?

iNils 06.02.2011 01:15

Цитата:

У тебя есть аргументы против написания пустого super() или что-то, что выдаст в этом дурной тон?
Есть. Он не нужен. А теперь попробуй доказать обратное.

Psycho Tiger 06.02.2011 01:28

А ещё не нужны пробелы и переносы строк. И там, и там компилятор всё сделает за нас.
Но и то, и то я делаю. Визуально проще.
Почему проще с явным указанием super: не всегда конструктор имеет длину в 50 строчек. Он бывает и под 200, и под 300 (про рефактор, структуру класса и всё остальное умолчим). Это несколько экранов. Гораздо проще увидеть super() в самом верху и успокоится, что здесь всё стандартно. В противном случае нет той подсказки, которая сообщит мне, где же будет super. Мне придется пользоваться поиском.

iNils 06.02.2011 01:35

Цитата:

Но и то, и то я делаю. Визуально проще.
Тебе проще. А кому-то нет.
Цитата:

Почему проще с явным указанием super: не всегда конструктор имеет длину в 50 строчек. Он бывает и под 200, и под 300
200-300 строк в конструкторе? Мне с тобой разговаривать больше не о чем.

Psycho Tiger 06.02.2011 01:57

Цитата:

Тебе проще. А кому-то нет.
В данном случае я делаю то, что рекомендует Adobe и мне это нравится. Ты делаешь наперекор и бросаешься такими аргументами? Всем не угодишь. Где-то должна была быть поставлена точка — "так делать правильно, так нет" и её поставил создатель языка. На данный момент твои слова немного противоречат твоим же:
Цитата:

Просто люди выдают свои личные предпочтения за "хороший тон".
Помимо рекомендаций есть личные предпочтения. Вопрос в том, готов ли ты отступить от рекомендаций ради своих предпочтений или нет. Ты можешь, я могу. Но я так и не увидел причин не разделять официальные нормы написания кода.

Цитата:

200-300 строк в конструкторе? Мне с тобой разговаривать больше не о чем.
Я нигде не говорил что это мой код.

iNils 06.02.2011 02:16

1. Ты следуешь 100% всех описанных там "норм"?

2. Создатель языка? Сомневаюсь. В том же адобовском хелпе эти нормы игнорируют. Как и в автоформате в родном Flash IDE, где официально должны были поддерживаться.

3. Это не официальные нормы, а рекомендуемые. И как я уже говорил выше, общий список норм вызывает
сомнение в адекватности того, кто это писал. Поэтому я не вижу причин разделять то, что там написано.

4. Если это не твой код, то требовать от автора кода писать super в конструкторе в 200 строк, это как перед казнью отказываться от жирной пищи, потому что она вредит здоровью. Даже если представить, что там есть супер, то тебя не спасет от поиска тот факт, что он будет на 178 строке конструктора.

Psycho Tiger 06.02.2011 02:42

1. Неа.

2. Рекомендации это не правила. Например, конвенция рекомендует скобку { переносить на следующую строку. Мне не очень нравится, я не соблюдаю. Но мой CS5 перенес его на новую.
Требовать от редактора соблюдений всех конвенций это глупо. Завтра Adobe может взять тебя на работу и они изменятся. К тому же в моём понимании я имею возможность писать код как хочу, и почему автоформат должен крушить его в капусту я не понимаю.

3. Возможно, это писал тот, кому нечем было заняться. А возможно их писал самый талантливый в мире программист. Мы можем смотреть на них со своей колокольни и либо согласится, либо отвергнуть. Я повторюсь, что хороший тон — это поступать так, как рекомендуется. Будь плохим парнем, пиши так, как принято у тебя или как тебе нравится. Выпусти свою конвенцию рекомендуемых норм — и тогда мои слова возле твоей конвенции будут плохим тоном. Но пока весь мир пользует ту, что предлагает Адоуб бросаться словами вроде "это плохой тон!" не нужно.

4. Я по коду по F4 ползаю, а он переносит меня на сигнатуру конструктора. Я хотя бы буду знать, нужно мне искать его или нет.
Получается — в мелких конструкторах super() писать не нужно, потому что бессмысленно, а в больших не нужно, потому что они уродливы и хорошим тоном их не поправишь?

Правилами количество строк у конструктора/методов тоже не оговорено. Это то же как бэ хороший тон. (Отсутствие фантомного кэширования JIT компиляций у конструкторов не в счет.)

Спор переходит в русло кто кого переспорит.
Я за однотипность. super() в одних классах (не 1 строкой), super(...) в других, и отсутствие super`а в третьих. По мне это маленький шажок к каше в коде. Это как в конструкторах { ставить на следующей строке, а в методах на той же.

iNils 06.02.2011 02:49

Цитата:

Но пока весь мир пользует ту
Не использует.

Psycho Tiger 06.02.2011 02:51

Цитата:

Сообщение от iNils (Сообщение 970832)
Не использует.

Ну, может быть я старпёр.
А по какой сейчас пишут?

i.o. 06.02.2011 03:34

Цитата:

А по какой сейчас пишут?
кто где какую видел, по такой и пишут. Ну или как самим нравится. Большинство вообще про эту конвенцию слышать не слыхивали, а те кто слышал, далеко не все ее придерживаются, скажем так.
В этом же FD код написан разными людьми и сочетает в себе чуть ли не все разновидности форматирования и написания кода. Хотя проект один.
Так что зачем разводить тут холивар писать супер() или нет. Нравится - пиши, не нравится - не пиши.
Мне вот например нравится переносить скобку на новую строку, хотя раньше писал на той же. Без проблем могу снова по-старому начать писать, был бы только смысл от этого.
А вообще, Инилс дело говорит - если знаешь как работает конструтор без супера, то в лишних телодвижениях надобности нет ;)

alatar 06.02.2011 19:23

Цитата:

Так что зачем разводить тут холивар писать супер() или нет. Нравится - пиши, не нравится - не пиши.
Тут даже больше: не нравится — стирай, нравится — не стирай. Все равно большинство IDE, по-умолчнанию, сами пропишут.
Я за соблюдение адобовской конвенции. Но строго соблюдать стоит только основные положения. Написание super() или расстановка пробелов (которые легко правятся форматтером) вещи второстепенные и непринципиальные.
Хотя для упрощения сравнения файлов автоформатом лучше не злоупотреблять.

mikhailk 06.02.2011 19:31

FlashDevelop сам super не ставит

alatar 06.02.2011 19:34

Цитата:

FlashDevelop сам super не ставит
FlashDevelor не единственная IDE

mikhailk 06.02.2011 19:39

Может я конечно и путаю, но разработка в 99% случаев ведется под нативной IDE, FD и FB (порядок - произвольный). Номер 1 и номер 2 супер не ставят.

iNils 06.02.2011 19:42

Цитата:

Сообщение от mikhailk (Сообщение 970946)
FlashDevelop сам super не ставит

Это правится в шаблонах классов.

mikhailk 06.02.2011 19:43

Это понятно.
Там вообще до черта всего настраивается.
Но в исходной-то поставке этого нет?


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

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