[31/2]: Снег и Пули: Управление добавленными объектами

Приветствую вас, друзья, во второй части урока я расскажу такую штуку, как удаление объектов в зависимости от того в каком кадре он находится. Это полезно делать когда у нас есть анимация, которая должна воспроизводится, при каких-либо столкновениях.

Главное, чему я вас научу в этом уроке – это как правильно удалять объекты с которыми происходят столкновения, и как понимать те ошибки, которые могут возникнуть. Я их специально оставил, чтобы вы понимали, как пишется код:) Ни сразу всё предвидишь и пишешь как автомат, а постепенно, исправляя ошибки, которые появляются при различных манипуляциях.

Кратко о главном: Для того чтобы удалить объект со сцены ПОЛНОСТЬЮ, недостаточно написать removeChild. Адобовский флеш он настолько “умный”, что делится, можно сказать, на 2 части. А может и не 2… (О_о ). Вообщем, в одной части (в памяти) – мы храним данные об объекте (координаты, размеры, переменные и т.д.) и ссылки, а в другой части (списке отображения) – сами изображения, которые рисуются на экране.

Воспринимайте removeChild как – отправление объекта в инвиз :D Он есть, но мы его не видим :)

Так вот, removeChild() удаляет только картинку из списка отображения. Но все данные об объекте у нас остаются. Т.е. если бы снова написали addChild, то объект добавился в туже точку и был такой же, какой был раньше! Можете в этом убедиться добавив в функцию полета пули ещё условие:

Тогда при полете пули её изображение пропадет в координате между 250 и 260, а потом появится в координате между 350 и 360.

Для того чтобы полностью удалить все данные об объекте, нужно написать “= null”.
Тогда флеш полностью выкидывает из памяти всё, что знал об объекте. Кстати говоря, в примере со снегом в исходнике я добавил его. Потому что после очень долгого времени, флеш может начать тормозить, ибо в памяти накапливается много данных о снежинках, которые мы удалили (а мы удалили только картинки).

Мнение адоба о removeChild()::
- – -
public function removeChild(child:DisplayObject):DisplayObject
Удаляет заданный объект child DisplayObject из списка дочерних элементов экземпляра DisplayObjectContainer. Свойство parent удаленного дочернего элемента получает значение null, а сам объект утилизуется в ходе «сборки мусора», если отсутствуют другие ссылки на дочерний элемент. Позиции индекса экранных объектов, расположенных над дочерним элементом в DisplayObjectContainer уменьшаются на 1.

Сборщик мусора перераспределяет неиспользуемый объем памяти. Когда на переменную или объект больше нет ссылок или он хранится в другом месте, сборщик мусора очищает и утилизирует память, которую он занимал, при условии отсутствия ссылок
- – -

Подробнее обо всём этом смотрите в видео ниже, в котором реализованы выстрелы из автомата и уничтожение шарика пулями.

Исходник: yadi.sk/d/g4VNmEofBgTwi

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

В данном примере сначала создается клип со снежинкой, с привязкой к Action Script по имени sneg_mc. Далее создается мувиклип с человечком с именем man, мувиклип с шариком по имени shar, и муви клип с патроном, с привязкой к Action Script по имени pulya_mc.

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

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

    Все равно не выходит полностью обнулить обьекты .Вот ссылка на исходник

      • admin

        http://yadi.sk/d/lvfHMvPSQ8q3C
        что такое if(contains(k)) removeChild(k); я даже не представляю… Но даже если бы это было правильно всё равно бы не работало, т.к. перед этим у тебя if (k.hitTestObject(gran)) {
        у тебя вообще в начале всего должно быть условие if (k) { а внутри уже все действия с ним… хотя зачем всё так жестко усложнять… Про какие ещё классы люди говорят… Если тут в обычных кадрах столько непонимания.

        • Тема

          Спасибо большое теперь и впрямь стало видно сколько лишнего я наделал.

  2. Ranex

    Довольно интересный способ добавления пули… я конечно же пытался изобрести свой способ) ..было что то на подобие паблик функшин, а внутри обычная функция… ужас но работало…)) ..но решил грохнуть эту жуть..
    сделал как у тебя, ток не пойму, ведь все что задаётся в функции существует только внутри функции, но как же это:
    “pulya.skorost = 10;” в одной функции, а используем в другой, что это за нюанс?
    Что то связано с объектами?
    Для меня самая сложная строчка была вот этой:
    var pulya:MovieClip = e.currentTarget as MovieClip;
    я сначала пробывал сделать проще:
    bullet.addEventListener(Event.ENTER_FRAME, moveBullet);
    function moveBullet(e:Event)
    {
    bullet.x = bullet.x + 15;
    }
    Но к удивлению ничего хорошего не получилось

    • admin

      И понятно что ничего не получилось. :) Фишка тут в чем. Чтобы управлять объектом, который вызвал функцию, нужно написать e.currentTarget as MovieClip; – эта фигня и есть ссылка на источник функции да ещё с привидением типа к мувиклипу. Я понятия не имею зачем ас3 такой…. но он такой.
      “pulya.skorost = 10;” Если мы цепляем обработчик событий addEventListener к pulya, то используя e.currentTarget as MovieClip; ( ссылка на мувик вызвавший эту функцию), мы легко можем прицепить к пуле кучу параметров какие хотим и менять то, что хотим. Как бы она у нас используется не в другой функции, а внутри той получается.

      • Ranex

        Как же заумно всё приходится делать :) это прям как лазейка в функцию через черный ход))
        Еще я пробывал вызвать функцию внутри функции, не где конечно такого не встречал:
        public function addBullet(e:MouseEvent):void
        {…
        bullet.addEventListener(Event.ENTER_FRAME, moveBullet)
        function moveBullet(e:Event)
        { …
        }
        }
        это нормально? :)

        • admin

          Не знаю, попробуй :D От этого ас3 можно ожидать чего угодно xD

  3. Ranex

    С пулями(которые создаются в функции) и шаром(статический объект сцены) теперь понятно… А как проверить столкновение объектов из библиотеки?(К примеру если шары будут генерироваться также из функции, как и пули)

    • admin

      ага, хорошо, подумаю над этим. на днях выложу ответ.

    • admin

      Блин, флешку сделал ещё 17 числа, а вот сделать по ней урок всё никак…:( То занят, то лень. :)
      В общем, вот исходник: https://yadi.sk/d/D-uSbPi6dkQDy

      • Ranex

        Класс! И бэкграунд греет душу :) ) А то я уже начал ставить сомнительные эксперименты :) Очень жду от тебя видео урока, а пока буду копаться в кодах…

        • admin

          Видеоурок я точно делать не буду :) Это дофигища времени надо на него) Я сделаю в такой форме http://codeforgames.ru/faq-inventar/
          Объясню принцип и что нового и для чего. Там многое из “снежно-пульного” урока :)

          • Ranex

            А как прочности шарам добавить, к примеру чтобы с 3 пули только взрывался? :)

        • admin

          да элементарно. для клипа с шаром цепляешь параметр здоровья, к примеру shar.hp = 3; и при столкновении пули с шаром – вычитаешь 1 hp. А при 0 hp пишешь чтобы шар удалился.:)

          • Ranex

            я вот вчера так и делал, ток что то делал не так… Сегодня прочел твой ответ и убедился, что принцип правильный был, а вот прочности добавлял не в том месте где надо. Сегодня выпил чаю и сделал за 10 мин как надо ))

        • admin

          Ну вот) Спокойное обдумывание с чаем – помогает в решении любых задач :D

  4. Ranex

    Привет! Объясни пожалуйста, как можно ИИ заставить летать по разным траекториям? (а не что бы они просто прямо летели друг за другом и стреляли вперед)

    • admin

      Привет. Пишешь скрипт полёта по нужным тебе траекториям. Вправо, влево, вверх, вниз, в сторону героя, по кругу, по ключевым точкам (я бы делал так), можно и другие схемы придумать с рандомами.

      • Ranex

        А как сделать по ключевым точкам?

        • admin

          Создаешь архив с координатами, через которые должен пролетать ИИ. И двигаешь ИИ к первой точке, по достижении её, направляешь ко второй точке и т.д. Если в определенном радиусе от него маячит персонаж, то ИИ начинает атаковать его, к примеру. Если персонаж покинул зону атаки, то ИИ возвращается в направлении второй точки, либо третьей, либо иным образом и т.д.

          Так же можно задать кривые траектории через ключевые точки. Для этого надо будет передвигать ИИ не линейно +х или +у, а использую синусы, косинусы и различные формулы движения.

          Либо ещё вариант, сделать анимацию движения ИИ в клипе (не программно). А когда нужно действие от ИИ, добавить уже программно из библиотеки врага в то место где анимированный ИИ, а анимацию остановить и скрыть. Т.е. сделать подмену анимации клипом. И тут уже ИИ будет атаковать врага, а когда закончиться вернуть на место и возобновить анимацию или делать другие действия. НО это загонно, проще всё программно сделать.

Добавить комментарий для admin Отменить ответ

Ваш 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="">