Ожидание, сообщения и взаимодействие объектов

Scratch для юных программистов

Как работать с новой темой

Ожидание, сообщения и взаимодействие объектов

Повелители времени: Зачем программе уметь ждать?

Представь, что ты режиссёр космического боевика. Твой главный герой — отважный космонавт — подходит к огромной ракете, нажимает на кнопку запуска, и… в ту же микросекунду ракета улетает в космос, оставив космонавта на Земле. Или ещё хуже: игра только началась, а на экране одновременно появились и надпись «Уровень 1», и финальный босс, и победный салют, и надпись «Конец игры»! Получилась страшная неразбериха, верно?
Компьютер — парень невероятно быстрый. Он выполняет миллионы команд в секунду. Если ты дашь ему сто команд подряд, он выполнит их так мгновенно, что твои глаза увидят лишь финальный результат, а вся красота анимации просто пропадёт.
Чтобы в наших играх не происходило такой суматохи, в Scratch есть великая команда-замедлитель. Живёт она в оранжевом шкафу под названием «Управление», а на её вывеске написано: ждать (1) секунд.
Этот блок — настоящий волшебный стоп-кран для твоего скрипта. Как только компьютер доходит до этой строчки, он замирает, включает внутренний секундомер и послушно отсчитывает указанное время. И только когда таймер дойдёт до нуля, компьютер вздыхает и переходит к следующему блоку, лежащему ниже.

Секреты управления временем:

  • Не только целые числа: Ты вовсе не обязан заставлять героев ждать целую секунду. Мир Scratch умеет делить секунды на крошечные дольки! Если вместо единицы ты напишешь 0.5, спрайт замрёт на полсекунды. А если напишешь 0.1 — получится едва заметная пауза, которая идеально подходит для создания плавной и реалистичной анимации бега, взмахов крыльев или мигания звёзд.
  • Главная ловушка новичков: Помни про Закон порядка! Блок ожидания останавливает только тот скрипт, в котором он находится. Если у твоего Кота Scratch написаны две независимые жёлтые «шапочки» событий, и в одной из них стоит пауза, то вторая цепочка блоков продолжит бежать вперёд как ни в чём не бывало.

Космическая почта Scratch: Что такое сообщения?

А теперь давай представим другую ситуацию. У тебя в игре есть два спрайта: Рыцарь и Дракон. Рыцарь должен дойти до края экрана, взмахнуть мечом, и в этот момент Дракон должен испугаться, зарычать и улететь.
Как сделать так, чтобы Дракон узнал, что Рыцарь уже подошёл и взмахнул мечом?
Можно попробовать высчитать время: «Так, Рыцарь идёт до Дракона примерно 3 секунды, значит, Дракону нужно поставить блок ждать 3 секунд, а потом включить рык».
Но что, если игрок нажал клавишу паузы? Или если Рыцарь застрял по дороге в текстурах? Тогда таймер Дракона сработает раньше времени: Рыцарь ещё топчется в начале пути, а Дракон уже испугался пустоты и улетел. Получится глупо и некрасиво.
Для того чтобы спрайты умели общаться друг с другом без всяких неточных секундомеров, умные создатели Scratch придумали гениальную систему — Сообщения (в программировании их называют радиовещанием или широковещательными сигналами).
Сообщения в Scratch — это невидимые электронные письма, которые спрайты могут мгновенно отправлять друг другу. Это похоже на то, как судья на беговом треке стреляет из стартового пистолета. Этот звук слышат абсолютно все спортсмены на стадионе. Судье не нужно подбегать к каждому бегуну и шептать: «Твой черёд, беги!». Он просто создаёт одно громкое событие — и все, кто его ждал, одновременно срываются с места.
В Scratch за эту космическую почту отвечают три волшебных блока из знакомого нам жёлтого раздела «События». Давай познакомимся с ними поближе!

1. Блок-почтальон: передать [сообщение1]

Этот блок отправляет сигнал в игровое пространство. Как только спрайт доходит до этой команды, он словно кричит в невидимый мегафон: «Эй, все-все-все! Событие произошло!». Самое интересное, что сам отправитель после этого не ждёт ни секунды — он выкрикнул сообщение и тут же продолжает выполнять свои команды, которые прикреплены снизу.

2. Блок-контролёр: передать [сообщение1] и ждать до конца

Этот блок гораздо строже своего весёлого брата. Это не просто почтальон, а курьер, которому обязательно нужна подпись о вручении! Когда спрайт выполняет эту команду, он отправляет сигнал, но сам замирает на месте. Он не сдвинется ни на один блок вниз до тех пор, пока все остальные спрайты, поймавшие это письмо, не завершат свои скрипты до самого конца.
Пример: Король передаёт сообщение «Гимн» и ждёт до конца. Музыканты играют гимн. Пока они не закончат играть последнюю ноту, Король не начнёт свою речь.

3. Блок-приёмник: жёлтая шапочка когда я получу [сообщение1]

Это совершенно особая, новая «шапочка» событий. Спрайт, у которого есть такой блок, может спокойно спать в сторонке и вообще не реагировать на зелёный флажок. Он просто сидит в засаде и «слушает» эфир. Но как только в пространстве игры проносится кодовое слово, этот спрайт мгновенно просыпается и начинает выполнять цепочку команд, закреплённую под этой шапочкой.

Как правильно называть шифры, чтобы не сойти с ума?

Когда ты создаёшь новое сообщение, Scratch по умолчанию предлагает назвать его сообщение1. Если в твоей игре всего два действия, это вполне сойдёт. Но представь, что ты делаешь большую, крутую игру-квест с кучей уровней, диалогов и секретов.
Через пару дней у тебя появятся сообщение1, сообщение2, сообщение3… и так до тридцати! Ты откроешь свой проект и обнаружишь, что совершенно забыл, какое сообщение отвечает за взрыв бомбы, а какое — за появление прекрасной принцессы. Игра превратится в распутывание огромного клубка из ниток, а вместо удовольствия от программирования ты получишь головную боль.
Золотое правило программиста: Всегда давай сообщениям понятные, «говорящие» имена! Компьютеру всё равно, как называется сигнал — для него это просто набор букв. А вот для тебя это спасательный круг.
Как переименовать сообщение:
  1. Кликни по маленькой стрелочке внутри блока сообщений.
  2. Выбери строчку «Новое сообщение».
  3. В появившемся окошке напиши чёткое имя-приказ.

Примеры отличных имён для сообщений:

  • старт_игры — сразу понятно, что по этому сигналу нужно спрятать главное меню и показать игровое поле.
  • бабах — этот сигнал заставит экраны трястись, а монстров — разлетаться в стороны.
  • дракон_улетел — по этому письму сцена может сменить мрачный фон замка на цветущую поляну, а спасённые жители выйдут из укрытий.
  • минус_одна_жизнь — этот сигнал заставит сердечко на экране замигать и уменьшить счётчик здоровья.

Великое взаимодействие: Как спрайты работают в команде?

Теперь, когда в нашем арсенале есть и блоки времени, и система сообщений, мы можем заставить наши спрайты работать слаженно, как швейцарские часы или настоящая сыгранная театральная труппа.
Давай разберём по шагам, как устроено идеальное командное взаимодействие на примере классической сценки: «Умный замок и Секретная кнопка».
Задача:
На сцене стоят закрытые Ворота (первый спрайт). Рядом находится Секретная Кнопка (второй спрайт). Игрок должен кликнуть мышкой по Кнопке, Кнопка должна плавно нажаться, издать щелчок, а Ворота после этого должны медленно подняться вверх, открывая путь в волшебную страну.
Как это запрограммировать? Посмотрим на логику работы:
Шаг 1. Готовим Кнопку.
Мы выбираем спрайт Кнопки. Нам нужно, чтобы она среагировала на клик мышки. Какое событие выберем? Конечно, знакомый нам блок когда спрайт нажат.
Что делает Кнопка? Она меняет костюм на «нажатая», проигрывает звук «Click» и — самое главное! — отправляет в эфир секретный шифр. Мы создаём новое сообщение и называем его ворота_откройтесь. После этого кнопка ждёт 0.2 секунды и возвращает свой обычный костюм обратно.
Шаг 2. Программируем невидимую почту.
Блок передать [ворота_откройтесь] мгновенно рассылает сигнал по всему проекту. Кнопка своё дело сделала, она может отдыхать.
Шаг 3. Настраиваем Ворота.
Мы переходим в рабочую зону кода Ворот. По зелёному флажку ворота должны быть закрыты — это их стартовое состояние. Но они не знают, когда именно игрок кликнет по кнопке. Поэтому мы вешаем на них жёлтую улавливающую шапочку: когда я получу [ворота_откройтесь].
Шаг 4. Действие!
Как только Ворота «услышали» нужный шифр, срабатывает их внутренний скрипт. Под шапочкой мы собираем блоки движения: например, повторить 10 раз -> изменить Y на 10. Ворота плавно уползают вверх. Происходит магия взаимодействия!

Главные правила командной работы в Scratch

Чтобы твои программы всегда работали чётко, а спрайты никогда не ссорились, держи под рукой этот короткий чек-лист:
  • Проверяй адресата: Помни про Закон разделения труда. Блок передать сообщение ставится тому спрайту, который совершает действие (кнопка, 
    • побеждённый враг, собранная монетка). А блок когда я получу сообщение ставится тому спрайту, который должен на это действие отреагировать (дверь, счётчик очков, победный экран).
    • Сцена тоже умеет слушать! Сцена — это полноценный участник команды. Она тоже может иметь блоки когда я получу [сигнал]. Это супер-удобно для смены уровней: например, когда твой герой доходит до двери, он передаёт сообщение новый_уровень, а Сцена ловит его и переключает фон.
    • Один кричит — многие делают: Одно и то же сообщение могут одновременно поймать сколько угодно спрайтов! Если Кот крикнет бабах, то по этому сигналу летучая мышь может спрятаться, камень — расколоться, а Сцена — окраситься в красный цвет. И всё это произойдёт в одно и то же мгновение!
    Поздравляю! Теперь ты знаешь, как превратить разрозненных персонажей в дружную команду, которая умеет общаться, ждать друг друга и создавать настоящие живые миры!
     

    Задание 1. Музыкальный дуэт: Пёс-дирижёр и Кот-певец

    На сцене выступает необычный музыкальный дуэт. Пёс взмахивает лапами, даёт команду Коту, а Кот послушно ждёт знака и начинает петь свою знаменитую песню:

    1. Добавь два спрайта из библиотеки: Пса (Dog) и Кота (Scratch Cat). Назови их «Дирижёр» и «Певец».
    2. Запрограммируй Дирижёра: по нажатию на 🚩 Зелёный флажок он должен сказать: «И-и-и... начали!» (2 секунды), а затем передать сообщение с именем песня_старт.
    3. Запрограммируй Певца: он не должен петь сразу! Поставь ему жёлтую шапочку когда я получу [песня_старт].
    4. Сразу после этого Певец должен изменить свой костюм (открыть рот), сказать «Мяу-мяу-мяу!» (1 секунду), затем подождать 0.5 секунд, сменить костюм обратно и сказать «Ля-ля-ля!».

    Задание 2. Квест «Таинственный Сундук и Золотой Ключ»

    В мрачном замке стоит запертый сундук с сокровищами. Открыть его просто так нельзя — нужно найти секретный золотой ключ и кликнуть по нему мышкой:

    1. Выбери фон «Замок» и добавь два спрайта: Сундук (Chest) и Ключ (Key). Размести ключ в одном углу экрана, а сундук — в другом.
    2. Настрой Сундук: по 🚩 Зелёному флажку он обязательно должен переодеться в костюм «закрыт».
    3. Запрограммируй Ключ: используй блок событий когда спрайт нажат. Внутри этого скрипта Ключ должен издать звук «Стеклянный звон» (Chime), передать сообщение сундук_откройся и мгновенно спрятаться со сцены с помощью фиолетового блока «спрятаться» (ведь игрок его подобрал!).
    4. Вернись к Сундуку: добавь ему блок когда я получу [сундук_откройся]. Сделай так, чтобы после получения шифра сундук подождал 0.3 секунды (время на «полёт» ключа) и переключил свой костюм на «открыт», показав золото!

    Задание 3. Космическая тревога: Спасение Инопланетянина

    На космической станции беда — летит огромный астероид! Нам нужно нажать на аварийную кнопку: по этому сигналу станция окрасится в тревожный цвет, а инопланетянин успеет спрятаться в спасательную капсулу:

    1. Создай три спрайта: Красная Кнопка (Button), Инопланетянин (Gobo или Pico) и Астероид (Rocks). Выбери космический фон для Сцены.
    2. Запрограммируй Красную Кнопку: когда спрайт нажат, она передаёт сообщение тревога.
    3. Поймай сигнал в 3 местах одновременно:
      • Сцена: добавь код в рабочую зону Сцены! когда я получу [тревога], включи блок изменить эффект [цвет] на 25, чтобы экран тревожно замигал.
      • Инопланетянин: когда я получу [тревога], он должен испуганно сказать «Ой-ой-ой!» (1 секунду), запустить анимацию бега (быстро менять костюмы и идти в сторону края экрана) и спрятаться.
      • Астероид: когда я получу [тревога], он начинает стремительно лететь в центр экрана (изменять X и Y), создавая иллюзию опасности.


Проверь себя

← Предыдущая тема Следующая тема →

← Вернуться к разделу