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

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

И опять упомяну каким был всё таки замечательным AS 2.0. Все мудрости какие есть в этом уроке делались очень просто. Но AS 3.0 всё таки относится к ООП (объектно-ориентированному программированию), что весьма заметно, кругом одни объекты и объекты на объекты на объекты… Давайте перейдём собственно к теме)

Главное, чему я вас научу в этом уроке – это заставить добавляемые объекты из библиотеки что-то делать. В первой части урока я покажу как сделать снегопад из снежинок. По большему счету это получается генератор частиц, но это не важно.

Смысл следующий, чтобы заставить добавленный через addChild объект что-либо делать, нужно:
• прилепить к нему обработчик событий addEventListener с событием, которое нам нужно, допустим ENTER_FRAME,
• и написать функцию для этого события. Если в as 2.0 обращение к клипу делалось словом this, то в as 3.0 мы должны создать переменную, которая будет равна переменной события точка currentTarget, К примеру строчка:

Здесь, объект на сцене с именем clip создаёт обработчик события enter_frame с привязанной функцией dvigenie, а в самой функции, с помощью команды e.currentTarget, переменной sneginka присваивается объект который вызвал функцию addEventListener, т.е. – это clip.
Это если простыми словами, если адобовскими, то:
- – -
currentTarget:Object [только для чтения]
Объект, активно обрабатывающий объект Event с помощью прослушивателя событий. Например, если пользователь нажимает кнопку «ОК», текущей целью может быть узел, содержащий эту кнопку, или один из его предшественников, для которого зарегистрирован прослушиватель данного события.
- – -
Кстати в уроке я не упомянул, но переменная sneginka становится неизвестного какого-то типа Object как и currentTarget, а когда мы указываем тип снежинки MovieClip, то и currentTarget нужно преобразовать в мувиклип командой “as MovieClip“. Хотя, если по идее, currentTarget – типа Object, то указав этот тип у снежинки – код работал бы, а он не работает. Непростой там object…

Подробнее смотрите в видео ниже, в котором создается снегопад из снега.


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

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

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

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

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

    Не подскажите как с помощью такого вот способа (или похожего)
    var sneginka:MovieClip = e.currentTarget as MovieClip;
    передать в переменную либо имя символа( MovieClip) либо имя класса ….
    грубо говоря у меня есть несколько объектов, и мне нужно знать их имя или любое наименование чтобы сделать проверку . которые подаются на экран через .addEventListener

    • admin

      Честно говоря, не особо понял, но скажу.
      При добавлении объектов из библиотеки, мой совет – запихивать объекты в массив. И вам не нужно будет задать ни имён, ни номеров, ни переменных. Объекты будет каждый в своей ячейке.
      Либо задаёте для объекта (если он movieclip) свойство name, и обращаетесь к объекту с помощью команды getChildByName.

      • Denis

        ммм спасибо…. тогда еще вопрос… о чем говорят эти вот ошибки ,а то я не нашел внятных объяснений…
        ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
        at flash.display::DisplayObjectContainer/removeChild()
        at woman_fla::MainTimeline/och()

        TypeError: Error #2007: Parameter hitTestObject must be non-null.
        at flash.display::DisplayObject/_hitTest()
        at flash.display::DisplayObject/hitTestObject()
        at woman_fla::MainTimeline/och()

        woman_fla – мой проект ,och()-функция с проверкой на пересечение объектов и реакцией на нее…

        • admin

          первая ошибка – ты неправильно удаляешь объект, что-то с родительско-дочерним не так.
          вторая – объект не должен быть = 0, т.е. у тебя его просто нет, а ты пытаешься определить пересечение с ним.

          • Denis

            Еще один вопрос, как прекратить выполнение кода?.
            такая ситуация, когда у меня игра заканчивается (допустим игрок проигрывает) а меня все равно продолжается выполнение кода , то есть работают все проверки(if) и создания мувиклипов …

        • admin

          для этого делается условие на практически весь код, типа:
          if (все живы здоровы game == true) {
          выполняем все функции,
          потом в одной из функций мы понимаем, что герой помер, то
          устанавливаем game = false; и больше никакие функции выполняться не будут.
          }
          Это как вариант, обычно же, после конца игры, удаляют все функции и обработчики событий с помощью removeEventListener и т.д., чтобы была возможность перезапустить игру, не закрывая её. Либо, если у героя есть жизни, и надо перезапустить уровень. Но тут, конечно надо плясать от того, как построена сама игра.

          • Denis

            Спасибо, вот у меня как раз такой момент что , нужно запускать игру не выходя, грубо говоря кнопка заново , нифига не заново запускает код….

          • admin

            И правильно, потому что наверняка всё сделано неправильно :) Посмотри урок про пинг-понг, там я делал кнопку рестарт. Вот, сто пудов, либо ты функции удаляешь не так, либо создаёшь их таким образом, что нельзя их пересоздать заново. Чтобы работала кнопка рестарт, у тебя код должен быть примерно таким:
            • описание функций 1, 2, 3, 4…
            • выполняем эти функции
            Когда жмешь кнопку рестарт, ты удаляешь все запущенные функции (эвентЛистенеры) и изменяешь значения переменных,
            и снова добавляешь эти функции, при этом описание их остаётся каким и было всегда.
            п.с. смотри урок про пинг-понг, он простой, я думаю ты поймёшь работу рестарта.

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

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