Баг при удалении объекта во flash cs5

Приветствую вас, ребята и девчонки. Сегодня расскажу вам о небольшом косяке, который я случайно обнаружил во Flash. :) Делал я значит удаление объекта из объекта, и при удалении объекта со сцены мне начали прилетать ошибки. (О_о ) Думал-думал, закомментировал код – работает нормально, открыл – ошибка. И пришел к выводу, что это ошибка самой программы. Хотя может программисты так задумали, но я так не думаю…

Суть ошибки: При удалении объекта (круг) со сцены с помощью:

мы, по идее, должны были полностью удалить объект.  Мы удалили картинку, мы обнулили все данные, у нас теперь вообще нет круга! Мы не можем с ними ничего сделать после этого, потому что его нет. Однако! Если наш мувиклип проигрывался, и в нём есть какой-то код ActionScript, он будет выполняться! Причем так, как это было бы при наличии круга на сцене точно по времени в кадрах.

Поэтому в таком случае помогает остановка клипа, либо командой stop(), либо gotoAndStop(); иначе внутренний код клипа будет выполняться, а вы будете ломать голову в чём же дело :)
Подробнее смотрите в видео:

Код ActionScript 3.0 из урока:

Всё подробно рассказано в видео :) Если будут какие-либо вопросы, пишите в комментариях к видео. Надеюсь, данный урок по реализации скорости в action script 3.0 в программе adobe flash, поможет вам в разработке игр. :)

Надеюсь, этот видеопост :D будет полезен вам, а может и программистам из adobe, если они увидят это видео. Хотя может в версии Flash CC баг исправлен, но не думаю, ибо там тот же AS 3.0.  :)

Комментарии
  1. Denis

    Я новичок в АС но что, если после обнуления ссылки krug = null; принудительно запустить сборку мусора(garbage collector) – System.gc(); ?

    • Денис

      команда System.gs(); работает только при отладке, т.е. только когда ты запускаешь программу с помощью ctrl+enter, если просто запустить swf, то это не сработает.

  2. Денис

    Это не баг, так и должно быть. Когда мы пишем var krug = new krug_mc(); кажется, что переменная krug и созданный нами объект класса krug_mc это одно и тоже, но на самом деле это не так, переменная krug всего лишь хранит ссылку на объект. Так если например написать:
    var krug = new krug_mc();
    var krug2 = krug;
    у нас не будет два объекта krug_mc, у нас будет один объект и две переменных хранящих на него ссылку, причем управлять этим объектом можно будет через любую переменную. Код
    krug.x += 5;
    krug2.x += 10;
    переместит наш круг на 15 пикселей.
    Когда ты пишешь krug = null; ты на самом деле не удаляешь объект ты всего лишь удаляешь ссылку на объект. Если других ссылок на этот объект в программе нет, то этот объект становится доступен для “сборки мусора”(удаления объектов к которым невозможно больше обратиться в программе), но, то что объект доступен для сборки мусора это еще не значит, что он сразу будет удален, сборка мусора происходит автоматически по мере заполнения памяти, если количество памяти занятое такими объектами мало, то они будут в памяти пока программу не закроют. И все это время эти объекты, если их не деактивировать, будут продолжать работать, поэтому прежде чем так удалять ссылки на объект, надо сначала удалить все события, связанные с этим объектом(MOUSE.CLICK например, и любые другие), и остановить проигравание, если это муви клип, иначе пока такой объект висит в памяти, он будет отвлекать на себя часть мощностей компьютера. В принципе это обычно не критично конечно, но все равно не круто.

  3. Alexandrn

    Привет, Женя!
    Вот и мне посчастливилось столкнуться с этой ошибкой-не ошибкой, багом-не багом )))
    Так же удалял клип из клипа, а он продолжал проигрываться в невидимом мире )) Да, клипа нет а код в нём делает своё дело. И правильно, спасение, это возврат в этом же самом клипе (который нам нужно удалит) в самый первый кадр. То есть получается переброс бегуна происходит “через воздух” и в первый кадр он всегда так входит из любого другого. Видимо так и задумано разработчиками.
    Так можно скидывать счёт и вообще всё, как бы сброс. А клип таки удаляется командой parent.removeChild(this); в последнем кадре без стопа и уходит на “воздух” и всё сбрасывает. А если хочу удалить клип из не конечных его анимаций, то gotoAndStop’ом перекидываю их концы на самый последний.
    А что, в следующих версиях флеша такое уже убрали, Жень?

    • admin

      привет :) Не обязательно делать возврат куда-то, можно просто остановить анимацию, чтобы дальнейший код, если он там где-то есть не выполнялся)
      Насчёт “убрали или не убрали” я не знаю :) Этот баг не такой напряжный, как другой, а именно: неправильное сложение дробных чисел. Вот это печальная печаль, подстава подстав. Типа если к 0.2 прибавить 0.2, а потом ещё 0.2, то получится 0.6000000000000000000001 или 0.59999999999999999998 и тому подобное. Приходится округлять или писать условия для таких чисел уже по-другому. Исхищряться по-разному….

  4. Alexandrn

    Так! ))) Да уж, поганая подстава с этими числами дробными. Пока не буду их использовать, ввиду не сильного знания as3.0
    А команда hide(); применима только к мыши? Как временно скрыть кнопку button и клик на неё, а потом снова открыть, когда надо будет? Женя.

    • admin

      для кнопок и клипов свойство visible = 0.
      clip.visible = 0. – не видно.
      clip.visible = 1. – видно.
      Если же кликать по ней всё равно будет можно (чего не должно быть), то можно тупо перемещать кнопку за пределы экрана, а когда надо вернуть на место))

  5. Alexandrn

    во во, я так и делаю, что сдвигаю за пределы поля или каким-нибудь клипом или ширмой закрываю ))) а теперь как раз нужно так, чтоб чисто “глазки закрыли, глазки открыли”. Спасибо!!!

  6. Alexandrn

    ага, скрывает даже кликабельность. Отлично! Токо ругается немного
    Symbol ‘level01′, Layer ‘as’, Frame 1, Line 39 Warning: 3590: int used where a Boolean value was expected. The expression will be type coerced to Boolean.
    это на кнопке. Хотя сама флешка работает без проблем.

    • admin

      Вот тут http://curtismorley.com/category/flex/page/7/ есть про эту ошибку Error #3590.
      Насколько я понял “int used where a Boolean” значит используется целое число, а должно быть логическое. А потом “will be type coerced to Boolean” тип данных будет преобразован в логический, поэтому всё работает как надо.
      Напиши сразу логический тип:

      clip.visible = false;

      Вот тебе и as3… :D Я и говорю, туповатый язык, в as2 что не напиши, будет работать без ошибок.:)
      И ещё) Если хочешь быстро понять в чём ошибка, можешь скопировать код ошибки и вбить в гуглояндекс :) что-нибудь да найдёт :)

  7. Alexandrn

    Оно самое!!!
    Так, Жень, гоняю тебя по пустякам. Типа для поддержки разговора. Спасибо!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">