загрузка . . .

Copyright © 2004

на главную


iboursky@mtu-net.ru

 

опыты с бабочкой


скачать исходник

мы познакомимся с некоторыми основными понятиями
  • сцена (размер сцены и цвет фона) и инспектор свойств ("Property inspector")
  • окно образцов ("Cast Window")
  • окно партитуры ("Score Window")
  • импорт и связанные файлы(linked files)
  • скрипты("behaviors") кадров и спрайтов
  • зацикливание фильма в одном кадре
  • вставка заготовок программного кода
  • использование Help'a Director'a
  • комментарий и форматирование текста скрипта
  • область видимости (переменные global, local, property )
  • отслеживание переменных в окне "Watcher" и "Message Window"
  • диалоговое окно с сообщением (alert)
    сцена и инспектор свойств

    Сначала создаём новый файл.

    Вызываем "Property inspector" (если его ещё нет в окне разработки) из главного меню, или соответствующей кнопкой.

    В "Property inspector" задаём размеры сцены и цвет фона.

    окно образцов ("Cast Window")

    Вызываем "Cast Window"

    и, щёлкнув пр. кнопкой мыши в белое выбираем "Import..." - не всё же делать в "Директоре" :)

    В данном случае оставляем "standart import", но можно выбрать и "Link To External File", если Вы хотите предоставить пользователю возможность заменять этот файл, или (если файл очень большой) с целью уменьшить размер "директорского" файла.

    После двойного щелчка по нужному файлу, в следующем окне ("select format") выбираем "Animated GIF", затем перетаскиваем мышью бабочку из Cast Window на середину окна сцены.

    Двойным щелчком по бабочке на сцене вызываем окно свойств GIF-файла. Нажав на кнопку "play", мы увидим, что бабочка очень быстро машет крыльями. Исправим это, выбрав "Fixed" из выпадающего списка "Rate". Можно оставить значение "15" в поле "fps"(кадров в секунду), а можно увеличить или уменьшить его, соответственно ускорив или замедлив полёт бабочки.

    в "Property inspector" на вкладке "Sprite" задаём прозрачный фон для бабочки

    окно партитуры ("Score Window")

    Зацикливаем действие во 2-м кадре. Для этого вызываем партитуру спрайтов ("Score Window")

    скрипты("behaviors") кадров и спрайтов

    Щелчком правой кнопки мыши в зоне скриптов кадра (например, в кадре "2") вызываем контекстное меню и выбираем "Behaviors..."

    В открывшемся окне "Behavior Inspector", нажав на кнопку со знаком плюс, создаём новый behavior для кадра, назвав его "кадр"

    Нажав на кнопку со знком плюс в группе "Events", выбираем "Exit Frame"

    Нажав на кнопку со знком плюс в группе "Actions", выбираем "ждать в текущем кадре"

    и теперь, если мы запустим воспроизведение нашего фильма, то в окне партитуры ("Score Window") увидим, что красная полоска головки воспроизведения находится всё время во 2-м кадре.

    Для работы нам частенько бывает нужно фиксировать разные свойства наших объектов. Чтобы запомнить номер спрайта бабочки сделаем следющее. Выделите бабочку на сцене или в партитуре. В "Property inspector" на вкладке "Behavior", нажав на кнопку со знаком плюс, создаём новый behavior для бабочки, дав ему название "бабочка"
    ,

    вставка заготовок программного кода

    затем, нажав на кнопку "Script Window", открываем скрипт "бабочка" в окне скриптов.

    Нажав кнопку "Lingo в алфавитном порядке" выбираем из выпадающего списка нужное нам слово "property" и допечатываем (уже в окне скриптов) название нашего свойства: mySprNum. Это ВСЁ было бы, наверное, легче просто впечатать в окне скриптов :) , но мы не ищем лёгких путей, а учимся работать с окном скриптов.

    Теперь переводим курсор в окне скриптов на следующую строку и, нажав на кнопку "Lingo по категориям", выбираем функцию "on beginSprite" из раздела "кадры и партитура". Как Вы понимаете, эту же функцию можно найти используя кнопку "Lingo в алфавитном порядке", но мы не ищем лёгких путей, а учимся работать с окном скриптов :)
    Ещё нам понадобится функция "on exitFrame", чтобы в каждом кадре проверять, где находится курсор, и, еслинужно, поворачивать бабочку и изменять направление её полёта. Чтобы поместить функцию"on exitFrame" в окно скриптов, пойдём другим путём, или даже третьим :) . Вызовем "Behavior Inspector", нажав на нужную кнопку в Toolbar. В открывшемся окне "Behavior Inspector", нажав на уже известную кнопку со знком плюс в группе "Events", выбираем "Exit Frame"
    Теперь начнётся самое интересное !

    Опять переводим курсор в окне скрипта "бабочка" на следующую строку и, теперь уже вручную впечатываем заготовку нашей основной рабочей функции ("Handler") "БабочкаЗаМышью" (обязательно в одно слово, цифры недопустимы в начале, зато возможны в середине и в конце) :

    on ButterflyAfterMouse
    end

    Как только бабочка появится в нашем фильме, мы должны зафиксировать её номер спрайта (инициализировать "mySprNum" в "on beginSprite"). Для этого пишем:

    on beginSprite me
      mySprNum=me.spriteNum
    end  
    использование Help'a Director'a

    Чтобы узнать, что-же такое "me.spriteNum", щёлкнем правой кнопкой мыши куда-нибудь в "spriteNum" и выберем "Lingo Help" из контекстного меню... Часто бывает полезно посмотреть, как разработчики организовали тот или иной программный код :) .

     

     

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

    on exitFrame me
      ButterflyAfterMouse
    end  


    а в саму функцию "ButterflyAfterMouse" впишем следующий код:

    on ButterflyAfterMouse
      sdvigH=1
    sprite(mySprNum).rotation= 90
    sprite (mySprNum).locH=sprite (mySprNum).locH+sdvigH
    end  
    , где:
  • sdvigH это сдвиг вправо (или влево :), который мы будем потом менять
  • sprite(mySprNum).rotation это угол поворота бабочки
  • sprite (mySprNum).locH это место спрайта бабочки по оси Х ("locH" это "location horizontal")

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

    Уже потихоньку летает ! Давайте теперь отследим положение курсора по горизонтальной оси ("the mouseH"). Для этого в уже известном нам списке "Lingo в алфавитном порядке"(кнопка "L") выберем "if...then...else...end if"(на буковку " i "). Этот приём хорошо бы отработать, так как это действительно удобнее, чем каждый раз набирать вручную
    .

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

    Дело начинает потихоньку запутываться :) , поэтому нам не обойтись без комментариев к своему же программному коду. В "Директоре" это делается просто: пишем пояснения и жмём на кнопку "comment"


    , и комментарий не только отмечается красным цветом, но и пропускается компилятором.

    Чтобы всё было автоматически отформатированно, нажмём клавишу "Tab"
    Теперь допишем заготовку, чтобы получилось следующее:

    on ButterflyAfterMouse
     
    if the mouseH < sprite (mySprNum).locH then
      --если мышь левее бабочки
    sdvigH= -1--будем двигать влево
    sprite(mySprNum).rotation= -90--повернём влево
    else  
      --если мышь правее бабочки
    sdvigH= 1--будем двигать вправо
    sprite(mySprNum).rotation= 90--повернём вправо
    end if
    --сдвигаем бабочку по горизонтали
    sprite (mySprNum).locH=sprite (mySprNum).locH+sdvigH
    end  


    Теперь, запустив фильм, попробуйте заводить курсор левее и правее бабочки.

    отслеживание переменных в окне "Watcher" и "Message Window"

    Прежде чем продолжить дрессировать нашу бабочку, давайте попробуем отследить какое-нибудь значение в окне Watcher. К примеру, выделим "the mouseH", а затем нажмём кнопку: .Откроется окно Watcher'a, в котором будет отображена горизонтальная координата указателя мыши (значение, относительно левого края сцены). При перемещении курсора можно увидеть, как изменяется эта величина. Но есть одна тонкость: Watcher показывает значениетолько глобальных (global) переменных переменных, то есть тех, которые могут быть доступны из любого скрипта. А в нашем скрипте "бабочка" есть ещё два типа переменных: свойство (property) "mySprNum" и локальная (local) переменная "sdvigH". У них разная, так называемая, область видимости. То есть свойство (property) "mySprNum" должно читаться в любой функции, но только в скрипте"бабочка", а локальная (local) переменная "sdvigH" может быть "видна" только внутри функции "ButterflyAfterMouse". Проилюстрировать это можно так: выделим "sprite (mySprNum).locH" и нажатием кнопки Watcher'a посмотрим значение горизонтальной координаты бабочки. Оно будет <Void>, то есть не обьявленное. Посмотреть значения этих переменных можно в окне сообщений ("Message Window") . Вызовем его кнопкой . В конец функции "on beginSprite" (перед "end") вставим строчку "put sprite (mySprNum).locH" и, запустив фильм , увидим в "Message Window" начальную горизонтальную координату бабочки. А если мы вставим эту же строчку в другие функции, то увидим покадровое изменение этого значения.

    Зато локальная (local) переменная "sdvigH" может быть "видна" окном "Message Window" только из последней строки функции "ButterflyAfterMouse". Вставим туда строку "put sdvigH" и, запустив фильм , увидим это. Из других функций эта строка будет генерировать ошибку "переменная использована до того, как ей присвоено какое-либо значение", то есть будет "не видна".

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

    on ButterflyAfterMouse
     
    if the mouseH < sprite (mySprNum).locH then
      --если мышь левее бабочки
    sdvigH= -1--будем двигать влево
    sprite(mySprNum).rotation= -90--повернём влево
    else  
      --если мышь правее бабочки
    sdvigH= 1--будем двигать вправо
    sprite(mySprNum).rotation= 90--повернём вправо
    end if

    --если по горизонтали мышь на уровне бабочки
    if the mouseH = sprite (mySprNum).locH then
     
    sdvigH= 0
    --проверяем по вертикали

    if the mouseV < sprite (mySprNum).locV then
      --если мышь выше бабочки
    sdvigV= -1--будем двигать вверх
    sprite(mySprNum).rotation= 0--повернём вверх
    else  
      --если мышь ниже бабочки
    sdvigV= 1--будем двигать вниз
    sprite(mySprNum).rotation= 180--повернём вниз
    end if
    end if
    --сдвигаем бабочку по горизонтали
    sprite (mySprNum).locH=sprite (mySprNum).locH+sdvigH

    --сдвигаем бабочку по вертикали
    sprite (mySprNum).locV=sprite (mySprNum).locV+sdvigV
    end  

    Уже летает вверх-вниз и вправо-влево. Но сразу захотелось,чтобы ещё и по диагонали!
    Сказано - сделано. Опять новый код отмечен жирным шрифтом, старый код - серый, еле видный:

    on ButterflyAfterMouse
     
    if the mouseH < sprite (mySprNum).locH then
      --если мышь левее бабочки
    sdvigH= -1--будем двигать влево
    sprite(mySprNum).rotation= -90--повернём влево
    else  
      --если мышь правее бабочки
    sdvigH= 1--будем двигать вправо
    sprite(mySprNum).rotation= 90--повернём вправо
    end if

    --если по горизонтали мышь на уровне бабочки
    if the mouseH = sprite (mySprNum).locH then
     
    sdvigH= 0
    --проверяем по вертикали
    if the mouseV < sprite (mySprNum).locV then
      --если мышь выше бабочки
    sdvigV= -1--будем двигать вверх
    sprite(mySprNum).rotation= 0--повернём вверх
    else  
      --если мышь ниже бабочки
    sdvigV= 1--будем двигать вниз
    sprite(mySprNum).rotation= 180--повернём вниз
    end if
    end if

    --сдвигаем бабочку по горизонтали
    sprite (mySprNum).locH=sprite (mySprNum).locH+sdvigH

    --проверяем по вертикали
    if the mouseV < sprite (mySprNum).locV then
      --если мышь выше бабочки
    sdvigV= -1--будем двигать вверх (и вбок)
    else  
      --если мышь ниже бабочки
    sdvigV= 1--будем двигать вниз (и вбок)
    end if


    --сдвигаем бабочку по вертикали
    sprite (mySprNum).locV=sprite (mySprNum).locV+sdvigV

    end  


    диалоговое окно с сообщением (alert)

    Ну и чтобы, долетев до кончика курсора-стрелки, бабочка не трепыхалась, как на булавке, мы выведем окно-сообщение с надписью "долетела :)" . Сделать это тоже не сложно. Нужно выполнить команду: alert "долетела :)" ,как только координаты бабочки и указателя ураняются. Проверяем это строкой:
    if the mouseLoc = sprite (mySprNum).loc then alert "долетела :)"

    , которую ставим в самый конец нашей функции.

    Вот, пожалуй, и всё.

     

    на главную
    Rambler's Top100
    Хостинг от uCoz