HaxeFlixel: this.destroy() внутри update()

[12:59:29] realyun1: Вопрос по flixel: Если я вызываю this.destroy() внутри update(), то приложение вылетает:

Called from ApplicationMain::main, ApplicationMain.hx 61
Called from Lib::create, flash/Lib.hx 89
Called from extern::cffi, /usr/lib/haxe/lib/hxcpp/3,0,2//src/hx/Lib.cpp 135
Called from Stage::__processStageEvent, flash/display/Stage.hx 444
Called from Stage::__doProcessStageEvent, flash/display/Stage.hx 333
Called from Stage::__pollTimers, flash/display/Stage.hx 866
Called from Stage::__checkRender, flash/display/Stage.hx 265
Called from Stage::__render, flash/display/Stage.hx 879
Called from DisplayObjectContainer::__broadcast, flash/display/DisplayObjectContainer.hx 267
Called from DisplayObject::__broadcast, flash/display/DisplayObject.hx 169
Called from DisplayObject::__dispatchEvent, flash/display/DisplayObject.hx 185
Called from EventDispatcher::dispatchEvent, flash/events/EventDispatcher.hx 89
Called from Listener::dispatchEvent, flash/events/EventDispatcher.hx 257
Called from FlxGame::onEnterFrame, org/flixel/FlxGame.hx 366
Called from FlxGame::draw, org/flixel/FlxGame.hx 683
Called from FlxState::draw, org/flixel/FlxState.hx 113
Called from FlxTypedGroup::draw, org/flixel/FlxTypedGroup.hx 129
Called from FlxTypedGroup::draw, org/flixel/FlxTypedGroup.hx 129
Called from FlxTypedGroup::draw, org/flixel/FlxTypedGroup.hx 127

Можно как-то уничтожить объект внутри update?
(примечание: от этого вопроса скроллить сразу вниз на ответ от автора HaxeFlixel (a_hohlov), если интересен не ход рассуждений участников, а только ответ на вопрос)

[13:00:04] SlavaRa: а нафига в апдейте гробить себя же?
[13:00:57] realyun1: У меня есть объекты, которые на каждый апдейт что-то проверяют (пусть это будет столкновение со стеной), и если условие вычислилось в истину, этот объект нужно уничтожить
[13:01:38] denis.flash: а там разве не kill?
[13:01:46] denis.flash: там вроде kill()
[13:01:52] denis.flash: вместо дестроя
[13:02:16] a_hohlov: лучше использовать kill(), тогда объект можно заново использовать с помощью метода recycle()
[13:02:27] a_hohlov: а если хочешь уничтожить то:
[13:02:28] SlavaRa: а почему ты из объекта это делаешь, зачем самоубийства?
[13:02:51] SlavaRa: я просто архитектуру понять не могу
[13:02:55] realyun1: > [Sunday, 9 June 2013 13:02:30 SlavaRa] а почему ты из объекта это делаешь, зачем самоубийства?

Потому что больше некому этим заняться, кроме как самому объекту )
[13:03:16] realyun1: Я могу, конечно, вынести это куда-нибудь, но это будет нелогично, т.к. это по сути и есть самоубийство )
[13:03:41] denis.flash: [13:00] SlavaRa:

<<< а нафига в апдейте гробить себя же?вообще-то таких задач полно
[13:03:57] denis.flash: а нафига в апдейте гробить себя же?например объект вышел из экрана
[13:04:02] denis.flash: для игр конечно
[13:04:03] SlavaRa: вообще самоубийство плохо
[13:04:09] denis.flash: ну а что делать)
[13:04:13] realyun1: > [Sunday, 9 June 2013 13:04:05 SlavaRa] вообще самоубийство плохо

Да, церковь не приветствует )
[13:04:20] denis.flash: например частицы
[13:04:27] Dima (deep): нельзя убивать себя на этапе апдейта, не важно игра это или гуи или еще чтото
[13:05:04] vtp.mf: не по православному это
[13:05:09] denis.flash: чего это нельзя, в играх так и делается
[13:05:31] Dima (deep): если бы вы стпрайт убивали во время рендера у вас были бы теже проблемы. просто у вас нет доступа к апдейту спрайтов
[13:05:36] denis.flash: проверяешь хп, меньше нуля и килл
[13:05:57] denis.flash: Update это тот же Enter_frame
[13:06:01] SlavaRa: плохой у тебя, Денис, к архитектуре
[13:06:25] denis.flash: Слава а ты игры делаешь?
[13:06:26] Dima (deep): [13:05] Denis Z:

<<< Update это тот же Enter_frameнет
[13:06:33] SlavaRa: [13:06] Denis Z:

<<< Слава а ты игры делаешь?да
[13:06:40] SlavaRa: в промышленных масштабах
[13:06:46] Dima (deep): Хохлов, чего молчишь, спасай
[13:07:13] denis.flash: Слава, и что ж тут плохого, особенно в движке Фликселя например, это вообще где угодно встретишь
[13:07:23] SlavaRa: апдейт и ентер фрейм разные понятия
[13:07:31] SlavaRa: [13:07] Denis Z:

<<< Слава, и что ж тут плохого, особенно в движке Фликселя например, это вообще где угодно встретишьс вилами
[13:07:34] a_hohlov: щас-щас
[13:07:39] denis.flash: та ясное дело что ENter frame один и это апдейт скачет по потомкам
[13:07:39] realyun1: Я понимаю, почему происходит краш - размер списка объектов на рендер уменьшается, и получаем out of bounds, но городить ради этой единственной ситуации какой-то дополнительный enterFrame не хочется
[13:08:00] Dima (deep): короче, вот если бы Саша оставил преапдейт, то там кил уместен
[13:08:10] Dima (deep): а вот в апдейте килить нельзя!
[13:08:10] denis.flash: [13:07] realyun1:

<<< Я понимаю, почему происходит краш - размер списка объектов на рендер уменьшается, и получаем out of bounds, но городить ради этой единственной ситуации какой-то дополнительный enterFrame не хочетсяэто где такое?
[13:08:27] denis.flash: в Ентер фрейме же обычном можно же убивать?
[13:08:36 | Изменены 13:08:43] SlavaRa: самойбиство это глупость архитектора, уж извините меня, я в своей команде люлей бы дал за такое
[13:08:41] realyun1: [Sunday, 9 June 2013 13:08:12 denis.flash] [12:07:39] realyun1: Я понимаю, почему происходит краш - размер списка объектов на рендер уменьшается, и получаем out of bounds, но городить ради этой единственной ситуации какой-то дополнительный enterFrame не хочется

<<< это где такое?

Чтобы не поломать рендер, нужно убивать объекты или до начала рендера или после завершения
[13:08:45] a_hohlov: parentGroup.remove(this, true);
this.destroy();
[13:08:49] Dima (deep): [13:08] Denis Z:

<<< в Ентер фрейме же обычном можно же убивать?ентерФрейм != апдейт. ну емае
[13:08:56] denis.flash: а как бы ты это сделал?
[13:09:13] realyun1: > [Sunday, 9 June 2013 13:08:48 Александр Хохлов] parentGroup.remove(this, true);
this.destroy();

Гранд мерси!
[13:09:14] denis.flash: та ясное дело!
[13:09:26] SlavaRa: кто-то отвечает за объект, он его создает и гробит если надо
[13:09:36] SlavaRa: Тараса Бульбу вспомните
[13:09:57 | Изменены 13:10:11] realyun1: > [Sunday, 9 June 2013 13:09:29 SlavaRa] кто-то отвечает за объект, он его создает и гробит если надо

Ружьё создаёт пулю и потом должно ещё заниматься постоянной проверкой, а не пора ли её убрать? )
[13:09:58] SlavaRa: и вообще реинкорнация в ввиде пулов самое то
[13:10:20] a_hohlov: поэтому kill() и предлагал
[13:10:22 | Изменены 13:10:30] SlavaRa: [13:10] Александр Кузьменко:

<<< Ружьё создаёт пулю и потом должно ещё заниматься постоянной проверкой, а не пора ли её убрать? )это тема для пула, не надо гробить их вообще
[13:10:28] a_hohlov: он для этого предназначен
[13:10:38] realyun1: > [Sunday, 9 June 2013 13:10:23 Александр Хохлов] поэтому kill() и предлагал

ок, попробую
[13:10:55] realyun1: > [Sunday, 9 June 2013 13:10:25 SlavaRa] [13:10:03] Александр Кузьменко: Ружьё создаёт пулю и потом должно ещё заниматься постоянной проверкой, а не пора ли её убрать? )

<<< это тема для пула, не надо гробить их вообще

Это мне понятно, но у меня нет необходимости создавать пул
[13:10:57] denis.flash: [13:08] Dima (deep):

<<< короче, вот если бы Саша оставил преапдейт, то там кил уместенчто за преапдейт?
[13:11:04] denis.flash: Prerender?
[13:11:06 | Изменены 13:11:41] SlavaRa: возьми пулемет, зачем создавать такие тонны объктов, пожалей память
[13:12:23 | Изменены 13:12:26] SlavaRa: и вместо кила у тебя будет возврат в пул и ресет, и все найс
[13:12:58] a_hohlov: как я вчера говорил, порядок вызова методов preUpdate(), update() & postUpdate() не всегда такой, как задумывалось автором
[13:13:05] Dima (deep): апдейт это почти системное событие, в обычном флеше вам нет доступа к нему и правильно. Саша упростил апдейт, убрав пре и пост апдейт, чем самым создал вот такие проблемы, типа килла. Все что надо сделать Саше это вернуть преапдейт или делать реальный килл после апдейта и перед дроу
[13:13:30] SlavaRa: [13:13] Dima (deep):

<<< апдейт это почти системное событие, в обычном флеше вам нет доступа к нему и правильно.смотря что ты имееешь ввиду, поидее есть
[13:13:33] realyun1: > [Sunday, 9 June 2013 13:12:26 SlavaRa] и вместо кила у тебя будет возврат в пул и ресет, и все найс

это всё мне понятно, но, как я уже говорил, у меня нет необходимости создавать пул. Новые объекты появляются раз в год
[13:13:54] SlavaRa: их должен гробить тот кто создал, породил - убил
[13:13:54] denis.flash: а в обычном фликселе, сильно все отличается?
[13:14:12] Dima (deep): [13:13] SlavaRa:

<<< смотря что ты имееешь ввиду, поидее естьнету. ты не можешь после валидации всех детей и перед рендером чтото сделать, эти этапы скрыты от нас
[13:14:20] SlavaRa: есть!
[13:14:23] a_hohlov: в случае, когда у вас есть вложенные группы, они вызываются для объектов в разных группах в "неправильном" порядке:
[13:14:42] SlavaRa: [13:14] Dima (deep):

<<< нету. ты не можешь после валидации всех детей и перед рендером чтото сделать, эти этипы скрыты от насинвалидация именно по этому и есть!
[13:14:57] a_hohlov: одни объекты уже вызвали эти три метода, а до других еще очередь не дошла
[13:15:09] SlavaRa: я могу или не делать или сделать, ед. что это не совсем красиво
[13:16:31 | Изменены 13:16:39] SlavaRa: @Deep, глянь про Event.RENDER и инвалидацию

[13:17:13] a_hohlov: друзья, вы обсуждаете фликсел с точки зрения обычного дисплей листа, но он работает по другому
[13:17:15] SlavaRa: я юзаю
[13:17:45] Dima (deep): я смотрю на фликсел как на систему контейнеров и инвалидацией и валидацией
[13:17:47] SlavaRa: [13:17] Александр Хохлов:

<<< друзья, вы обсуждаете фликсел с точки зрения обычного дисплей листа, но он работает по другомуя некрещеный и вера у меня, ну вы поняли.... самоубийцы даже в ней не труЪ
[13:18:25] Dima (deep): апдейт у тебя по сути этап валидации, делать кил на этапе валидации больно в любой системе
[13:18:47] a_hohlov: что имеется в виду под валидацией?
[13:18:59] a_hohlov: фликсел - очень "глупый"
[13:19:01] SlavaRa: пререндер
[13:19:08] a_hohlov: там два этапа
[13:19:23] a_hohlov: update() - это обновление логики
[13:19:37] a_hohlov: draw() - это обновление вида
[13:19:53] Dima (deep): тогда в апдейт килл должен работать


[13:20:26] a_hohlov: так вопрос не в том, что килл не работает, а в том, что destroy() вызывает ошибку destroy() - он нужен для обнуления всех ссылок внутри объекта, для облегчения работы сборщика мусора а kill() - для возможности повторного использования объектов
если у вас в игре есть такие объекты и вы их убиваете (методом kill()), и их мало, то они мало влияют на производительность
так как в методах update() и draw() есть проверки на active и visible, которые у "мертвого" объекта - false
при этом есть возможность их заново оживить с помощью метода recycle(objectClass = null):T
то есть вы можете "оживить" объект определенного класса
надеюсь, все понятно

и если бы Александр вызвал метод destroy() и в "старой" системе (с тремя update() методами), то это все равно бы вызвало ошибку

Стоит сказать, что решение в

Стоит сказать, что решение в последних 4-х фразах a_hohlov-а. Их бы как то выделить, а лучше вырезать из остального флуда

прямо под вопросом

прямо под вопросом (который выделен) примечание.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].
  • Use [gist:####] where #### is your gist number to embed the gist.

Подробнее о форматировании

CAPTCHA
Для отсева спамеров)
b
D
K
i
m
B
Enter the code without spaces and pay attention to upper/lower case.