Последовательное и одновременное выполнение скриптов в Scratch. Передача сообщений
В прошлых уроках мы соединяли блоки команд в конструкции, которые можно называть маленькими программками. Также их можно назвать скриптами. В одном проекте может быть множество скриптов. Например, если есть два героя-спрайта, вероятно у каждого будет свой скрипт, своя маленькая программа. А весь проект – это большая общая программа, состоящая из множества мелких.
В программировании отдельные части большой программы могут выполняться либо по очереди друг за другом, то есть последовательно, либо одновременно друг с другом, то есть параллельно. Во втором случае говорят о многопоточности, то есть одни скрипты работают в одном потоке, другие ‒ в другом, а разные потоки текут во времени одновременно.
Когда для каждого спрайта одного проекта вы добавляете свою конструкцию блоков, которая начинается с команды "когда флажок нажат", то как только игра запускается, оба героя начинают параллельно независимо друг от друга выполнять свои команды. Это пример одновременного выполнения скриптов.
Более того, в Scratch один и тот же спрайт может содержать два независимых скрипта, каждый из которых будет выполняться в своем потоке. Рассмотрим пример. Пусть кот ходит по сцене и при этом меняет свой костюм.
В Scratch многие спрайты на самом деле состоят не из одного изображения, а из нескольких. Это можно увидеть на вкладке "Костюмы".
Поэтому когда выполняется команда "следующий костюм", происходит переключение на следующее изображение спрайта. Если костюмов всего два, то они будут чередоваться.
В приведенном выше примере блоков кода оба скрипта будут выполняться одновременно. Мы увидим, что кот не только перемещается, но еще двигает ногами. Этот эффект возникает от того, что изображения-костюмы быстро меняются.
Если отсоединить блок "когда флажок нажат" от первого скрипта, то при запуске игры кот будет стоять на месте, будут двигаться только его ноги.
Если же мы отсоединим блок "когда флажок нажат" только от второго скрипта, то кот будет перемещаться, но его ноги не будут двигаться.
Таким образом, каждый скрипт вносит свой вклад и работает независимо от другого, но одновременно с ним.
Вы спросите, почему нельзя было вставить команду "следующий костюм" в цикл первого скрипта и вовсе отказаться от второго? На самом деле можно. Однако в этом случае кот начнет менять костюмы так часто, что у вас зарябит в глазах. Тогда почему бы сюда же не добавить команду "ждать … секунд"? Потому что в этом случае, кот будет останавливаться, и плавного движения не получится. Движение будет урывистым, перед каждой сменой костюма будет возникать задержка.
Теперь поговорим о последовательном выполнении скриптов. На самом деле такое поведение встречается чаще хотя бы потому, что команды в одном скрипте выполняются последовательно. А чтобы друг за другом выполнялись разные скрипты, один из них должен вызывать другой, то есть передавать своего рода сообщение.
Также бывает, что скрипт начинает выполняться только при определенных условиях. Например, когда нажимается одна из клавиш на клавиатуре. При этом работа других скриптов может как останавливаться, так и не останавливаться. Во втором случае это уже не может считаться последовательным исполнением.
Давайте рассмотрим вариант передачи сообщения, когда один скрипт вызывает другой. Пусть у нас будет два спрайта – кот и собака. Сначала кот ходит по сцене. И только когда он останавливается и исчезает, на сцене появляется собака и начинает ходить.
Поскольку при запуске игры один из спрайтов должен быть видимым, а другой невидимым, воспользуемся командами "показаться" и "спрятаться". Вынесем их в отдельные скрипты, чтобы они не мешались в основной логике игры.
Теперь когда кот выполнит свою порцию шагов, с помощью блока "передать сообщение1" он пошлет сообщение, которое может перехватить любой объект программы. В данном случае сообщение будет ждать только собака, потому что только ей мы добавили команду "когда я получу сообщение1".
И как только она получит сообщение, она покажется и начнет ходить.
В итоге получится, что скрипты, отвечающие за ходьбу кота и собаки, будут выполняться последовательно, один за другим.
Команда "передать сообщение" и "когда я получу сообщение" могут передавать любое сообщение, а не только "сообщение1". В проекте могут циркулировать десятки различных сообщений, которые одни объекты посылают, а другие ждут.
Чтобы добавить новое сообщение, надо кликнуть по маленькому треугольнику в этих командах и в раскрывающемся списке выбрать "Новое сообщение".
После этого на экране появится диалоговое окно, куда вводится сообщение. Например, "кот вызывает собаку".
Когда сообщение создано, оно становится доступным через раскрывающийся список команд "передать …" и "когда я получу …", где вместо точек может стоять любое сообщение.
При этом надо понимать, что если, например, кот передает сообщение "кот вызывает собаку", то собака должна получать именно это сообщение, а не какое-либо другое. Иначе она не будет реагировать.
Задание 1
Составьте программу по следующему описанию:
-
Кот недолго ходит по сцене, потом останавливается, но не исчезает.
-
Появляется второй спрайт и тоже недолго ходит по сцене.
-
Когда второй спрайт останавливается, кот снова начинает недолго ходить по сцене.
-
Когда кот останавливается во второй раз, на сцене появляется третий недолго бегающий спрайт.
При выполнении задания также воспользуйтесь блоком "передать сообщение и ждать до конца". Эта команда останавливает текущий скрипт до тех пор, пока не выполнится скрипт, который получает сообщение.
Задание 2
Составьте сценарий диалога двух спрайтов, например, такой. Кот и жаба (Wizard-toad) стоят напротив друг друга:
‒ Привет! ‒ говорит кот.
‒ Чего тебе? ‒ спрашивает жаба.
‒ Ты кто?
‒ Я волшебник!
‒ Ха-ха-ха! ‒ смеется кот.
После этого жаба превращается в человека, а кот с криком "Ой!" убегает.
PDF-версия курса с ответами к заданиям