Что такое клон в Scratch
Клон — это копия спрайта, которая появляется во время работы проекта и исчезает после нажатия на красный знак «стоп». В списке спрайтов клон не виден: он существует только на сцене, пока идёт игра.
В момент создания клон получает всё, что было у оригинала в эту секунду: положение на сцене, направление, костюм, размер, графические эффекты и значения переменных «только для этого спрайта». Дальше клон живёт своей жизнью. Если оригинал после этого поедет вправо, клон останется на месте — у каждой копии свои координаты и свой костюм.
Зачем это нужно? Представьте игру, где с неба падают 50 яблок. Можно нарисовать 50 спрайтов и скопировать в каждый одинаковый скрипт. Но если потом захочется, чтобы яблоки падали быстрее, придётся править 50 скриптов. Клоны в Scratch решают эту проблему: спрайт-яблоко один, скрипт один, а яблок на сцене сколько угодно. Исправили скрипт — изменились все копии.
Клоны появились в Scratch, созданном группой Lifelong Kindergarten в MIT Media Lab, как способ делать игры с множеством одинаковых объектов без копирования кода. Разработчики описывают Scratch как среду с «низким порогом и высоким потолком»[1]: клонирование как раз относится к «потолку» — его осваивают после циклов, условий и переменных. Проект поддерживает Scratch Foundation, а сам редактор бесплатен[3], поэтому все примеры с клонами можно повторить без покупок.
Три блока для работы с клонами
Все 3 блока для клонов лежат в оранжевой категории «Управление», внизу палитры. Каждый отвечает за свой этап жизни клона: рождение, поведение и исчезновение. Клоны в Scratch — тема не для первого занятия, но блоков здесь всего три.
| Блок | Форма | Что делает |
| «создать клон [самого себя]» | Обычный блок-команда | Делает копию выбранного спрайта. В выпадающем списке можно выбрать и другой спрайт |
| «когда я начинаю как клон» | Блок-шапка | Запускает скрипт у каждой новой копии сразу после её появления |
| «удалить клон» | Блок-крышка, после него ничего не присоединить | Убирает копию со сцены. На оригинал не действует |
Главное правило, которое стоит запомнить с первого урока: клон не выполняет скрипт «когда щёлкнут по зелёному флагу». Флаг уже нажат, когда он появился. Поэтому всё поведение клона — падение, полёт, исчезновение — описывают под шапкой «когда я начинаю как клон». А вот скрипты «когда я получу сообщение» и «когда спрайт нажат» работают у клонов так же, как у оригинала.
Блок «создать клон» есть и у сцены. Сцена не может скопировать сама себя, но может создать копию любого спрайта — удобно, если генератор врагов логичнее держать в одном месте, например в скрипте фона.
Пример 1: снегопад из одной снежинки
Снегопад — это 2 скрипта у одного спрайта: оригинал прячется и каждые полсекунды делает копию, а каждая копия появляется наверху в случайной точке и плавно падает вниз. Это самый короткий проект, на котором видна вся идея клонирования.
Нарисуйте маленькую белую снежинку и поставьте тёмный фон. Скрипт оригинала:
когда щёлкнут по зелёному флагу
спрятаться
повторять всегда
создать клон [самого себя]
ждать (0.5) секунд
Скрипт клона:
когда я начинаю как клон
перейти в x: (выбрать случайное от -230 до 230) y: (180)
показаться
повторять пока не <(положение y) < (-170)>
изменить y на (-3)
удалить клон
Сцена Scratch имеет размер 480×360, а её центр — точка (0, 0). Значит, верхний край — это y = 180, нижний — y = −180, а x меняется от −240 до 240. Клон стартует у верхней границы, на случайной высоте по горизонтали, и опускается на 3 шага за кадр. Когда снежинка уходит ниже −170, клон удаляется.
Обратите внимание на блок «спрятаться» у оригинала. Клон наследует видимость, поэтому без блока «показаться» в скрипте клона все снежинки тоже окажутся невидимыми. Это одна из самых частых ошибок новичков: «я создаю клоны, но их не видно».
Улучшения для самостоятельной работы: задайте копии случайный размер от 30 до 100 %, чтобы снежинки казались ближе и дальше; добавьте лёгкое покачивание — изменение x на случайное число от −1 до 1; сделайте так, чтобы крупные снежинки падали быстрее мелких.
Пример 2: стрельба клонами-снарядами
Чтобы игрок мог стрелять очередями, снаряд делают отдельным спрайтом, который прячется и создаёт свою копию при каждом нажатии пробела. Копия встаёт у пушки, летит вверх и удаляется у края сцены или при попадании.
когда щёлкнут по зелёному флагу
спрятаться
когда клавиша [пробел] нажата
создать клон [самого себя]
когда я начинаю как клон
перейти к [Корабль]
показаться
повторять пока не <касается [край]?>
изменить y на (10)
если <касается [Враг]?> то
передать [попадание]
удалить клон
удалить клон
Здесь две точки удаления: внутри цикла (снаряд попал во врага) и после цикла (снаряд долетел до края). Если забыть вторую, улетевшие пули останутся висеть у верхней границы и будут копиться. Спрайт «Враг» слушает сообщение «попадание» и, например, прибавляет очко и прячется.
Если пробел зажать, Scratch будет создавать снаряд на каждом срабатывании клавиши — получится сплошная струя. Чтобы сделать паузу между выстрелами, добавьте в скрипт оригинала «ждать 0.2 секунд» после создания копии или используйте переменную-перезарядку. Так стрельба выглядит честнее, а проект не тормозит.
Чем клон отличается от отдельного спрайта
Отдельный спрайт — это объект, который создают в редакторе руками, а клон появляется программно и живёт до остановки проекта. От этой разницы зависит, что выбрать для каждой задачи.
| Признак | Отдельный спрайт | Копия-клон |
| Как появляется | Создаётся в редакторе до запуска | Создаётся блоком во время игры |
| Видна в списке спрайтов | Да | Нет |
| Свои скрипты | Да, любые | Те же, что у оригинала |
| Реагирует на зелёный флаг | Да | Нет, при нажатии флага копии исчезают |
| Сколько может быть | Сколько нарисуете | До 300 одновременно на весь проект |
Удобное правило: если объект уникален (главный герой, кнопка «Старт», босс), делайте отдельный спрайт. Если объектов много и они ведут себя одинаково (капли, монеты, астероиды, искры), лучше клонировать один спрайт.
Как копия узнаёт, кто она
Если копии должны отличаться друг от друга — номером, скоростью, цветом, — используйте переменную с галочкой «только для этого спрайта». У каждой копии будет своё значение этой переменной.
Переменная «для всех спрайтов» одна на весь проект: если одна копия изменит её, изменится у всех. Переменная «только для этого спрайта» копируется в момент клонирования, и дальше у каждой копии хранится своя. Подробно о двух видах переменных рассказано в уроке про переменные в Scratch, здесь нам нужен только приём с номером:
когда щёлкнут по зелёному флагу
спрятаться
задать [номер] значение (0)
повторить (5) раз
изменить [номер] на (1)
создать клон [самого себя]
когда я начинаю как клон
перейти в x: ((номер) * (80) - (240)) y: (0)
показаться
говорить (номер)
Оригинал перед каждым клонированием увеличивает номер, а копия получает значение, которое было в эту секунду. В итоге на сцене пять копий в ряд, и каждая называет свой номер — от 1 до 5. Этот же приём помогает сделать ряд кирпичей в арканоиде или клавиши пианино.
Копии работают параллельно: у каждой свой экземпляр скрипта, и Scratch выполняет их все одновременно. Карен Бреннан и Митчел Резник называют параллельность одним из ключевых понятий вычислительного мышления наряду с циклами, условиями и событиями[2]. Клоны — самый наглядный способ её почувствовать. В описании языка Scratch (Maloney и соавторы) одновременное выполнение нескольких скриптов названо одной из его базовых особенностей.
Лимит 300 и скорость проекта
Число клонов в Scratch ограничено: на сцене не может быть больше 300 одновременно: при достижении лимита блок «создать клон» просто ничего не делает. Это защита от проектов, которые бесконечно размножают спрайты и подвешивают браузер.
Лимит встроен в сам редактор MIT, и обойти его настройками нельзя. Ошибки при этом не будет — новые объекты молча перестают появляться. Если снегопад вдруг стал редким через минуту игры, проверьте, удаляются ли снежинки внизу. Скорее всего, копии копятся за краем сцены, и лимит уже исчерпан.
Даже до лимита сотни копий нагружают компьютер, особенно слабый ноутбук или планшет. Чем больше у копии скриптов «повторять всегда» и проверок касания, тем сильнее падает скорость. Не стоит держать на сцене больше объектов, чем реально видно игроку, и удаляйте всё, что вышло за границы.
Не путать: копия и дубликат. Команда «дублировать» в контекстном меню спрайта создаёт новый постоянный спрайт в редакторе, а клонирование — временную копию во время игры. Как устроены сами спрайты, разобрано в статье про спрайты и костюмы в Scratch.
Когда клонирование не подходит
Клонирование не подходит, если объектов мало, они уникальны или должны сохраняться между запусками. В этих случаях отдельные спрайты, списки или перо дают результат проще.
- Объектов 1–2. Главный герой и одна дверь проще как отдельные спрайты: у них свои скрипты и их видно в редакторе.
- Нужен след на 1000 и больше точек. Рисунок из сотен копий упрётся в лимит; для следа и узоров есть расширение «Перо» и блок «печать».
- Объект живёт дольше 1 запуска. Копии исчезают при нажатии флага и «стоп»; рекорды и настройки храните в переменных.
- Ребёнку 7–8 лет и он ещё не уверен в циклах. Только после «повторить» и «если» стоит браться за копии — иначе понять, какой скрипт чей, трудно.
Два мифа о копиях
Вокруг клонов ходит 2 популярных заблуждения, и оба мешают правильно строить проект. Разберём их по очереди.
Миф: «копия получает свой собственный набор скриптов, и его можно поменять отдельно». Это не подтверждается: у копий нет своего кода, все они выполняют скрипты оригинала. Различаться их поведение может только через переменные «только для этого спрайта» и условия.
Миф: «копии исчезают сами, когда уходят за край». Такого механизма не существует: копия остаётся в памяти, пока не выполнит «удалить клон» или пока проект не остановят. Именно поэтому важен блок удаления в конце каждого сценария.
Ещё одна путаница — будто копии «тяжелее» спрайтов. Само клонирование занимает мало ресурсов; тормозит проект не факт копирования, а количество одновременно работающих циклов и проверок.
Чего делать нельзя
Нельзя создавать копии без плана их удаления: большинство ошибок с клонами — это забытые копии. Список ниже поможет избежать типичных проблем.
- Нельзя ставить «создать клон [самого себя]» под шапку «когда я начинаю как клон» без условия — каждая копия породит новую, и через доли секунды лимит будет исчерпан.
- Не стоит забывать «показаться» в скрипте копии, если оригинал спрятан: копии унаследуют невидимость.
- Не следует держать «повторять всегда» без выхода в скрипте копии — такая копия никогда не удалится.
- Нельзя хранить номер копии в переменной «для всех спрайтов»: все копии увидят одно и то же последнее значение.
- Не стоит клонировать главного героя ради «второй жизни» — проще вернуть его в начальную точку.
- Не допускается публиковать проект, который создаёт копии без паузы, — у других пользователей он может зависнуть на слабом устройстве.
Если хочется закрепить тему на большом проекте, загляните в пошаговый платформер в Scratch: монеты там удобно делать копиями одного спрайта.
Источники
[1] Maloney J., Resnick M., Rusk N., Silverman B., Eastmond E. The Scratch Programming Language and Environment // ACM Transactions on Computing Education. 2010. Vol. 10, № 4. Article 16.
[2] Brennan K., Resnick M. New frameworks for studying and assessing the development of computational thinking // Proceedings of the 2012 Annual Meeting of the American Educational Research Association. Vancouver, 2012.
[3] Scratch Foundation. Scratch: For Parents (раздел справки Scratch).
Вопросы и ответы
Почему клоны в Scratch не появляются на сцене?
Чаще всего оригинал спрятан, а в скрипте копии нет блока «показаться». Вторая причина — исчерпан лимит в 300 копий, потому что старые не удаляются.
Можно ли удалить оригинальный спрайт блоком «удалить клон»?
Нет, на оригинал этот блок не действует. Если оригинал должен исчезнуть, используйте «спрятаться».
Получают ли копии сообщения?
Да. Скрипт «когда я получу» срабатывает у оригинала и у всех его копий одновременно. Так можно, например, остановить всех врагов одним сообщением «конец игры». О механизме сообщений — в уроке про события и сообщения в Scratch.
Как удалить все копии сразу?
Отправьте сообщение, например «очистка», и добавьте скрипт «когда я получу [очистка] → удалить клон». Нажатие на флаг или «стоп» тоже убирает все копии. Перебирать копии по одной не нужно.
Может ли копия создать свою копию?
Может, и это полезно для фракталов или взрывов, но только под условием, которое ограничивает число поколений. Без такого условия рост будет лавинообразным.
Работают ли клоны в Scratch на планшете?
Да. Scratch 3.0, который MIT Media Lab выпустил 8 января 2019 года, работает в браузере на планшетах, и копии ведут себя так же. Но планшет слабее компьютера, поэтому десятки одновременно движущихся объектов там заметнее тормозят.
С какого урока изучать клоны?
После циклов в Scratch, условий и переменных. По данным Scratch Foundation, Scratch рассчитан прежде всего на 8–16 лет, а копии лучше изучать, когда ребёнок уже уверенно собирает игры. Для старта подойдёт снегопад из этой статьи: в нём всего 2 коротких скрипта.