Поки в проєкті один спрайт на одну річ, усе зрозуміло. Але гра рідко складається з одного ворога: потрібні десять астероїдів, двадцять монет, черга куль. Робити двадцять окремих спрайтів і двадцять однакових скриптів неможливо — щойно знадобиться правка, її доведеться повторити двадцять разів.

Для цього і потрібні клони. Один спрайт описує поведінку, а гра робить з нього скільки завгодно копій, кожна зі своїм життям. Тема вважається складною, хоча блоків у ній усього три; плутанина росте з двох правил, про які ніде не написано великими літерами.

Три блоки, і все

БлокЩо робить
створити клон [себе]робить копію прямо зараз
коли я починаю як клоншапка скрипта, який виконує копія
видалити цей клонкопія зникає назавжди

Типовий проєкт виглядає так: головний скрипт у циклі створює клони з паузою, а другий скрипт, під шапкою «коли я починаю як клон», описує, що копія робить — летить, падає, рухається до гравця і в кінці видаляє себе.

У випадаючому списку першого блока, крім «себе», перелічені інші спрайти. Це знадобиться рідше, але буває зручно: кнопка на сцені створює клони стріли, а не сама себе.

Що клон отримує в спадок

У момент створення копія забирає в оригіналу все видиме: місце, напрямок, розмір, костюм, ефекти, видимість. Тому поширений прийом — перед створенням клона поставити оригінал туди, де копія має з'явитися, і вже потім клонувати.

Так роблять дощ, зорепад, появу ворогів у випадковій точці: оригінал стрибає в випадкове місце, створює клон і стрибає далі. Сам оригінал при цьому зазвичай схований, і на сцені видно тільки копії.

Разом з виглядом успадковуються і значення змінних — але тільки тих, що створені «тільки для цього спрайта». Загальні змінні в усіх одні, і це наступна частина теми.

Зелений прапорець для клона не працює

Ось перше правило, на якому спотикаються всі. Скрипти під шапкою «коли натиснуто зелений прапорець» у клонів не запускаються ніколи. Прапорець натискають один раз, на початку, і до копій, що з'явилися пізніше, він не має жодного стосунку.

Дитина, яка цього не знає, пише поведінку ворога під прапорцем, бачить, що клони стоять нерухомо, і робить висновок, що клонування не працює. Насправді копії створилися чесно, просто їм ніхто не дав команди.

Правило просте: усе, що має робити копія, живе під шапкою «коли я починаю як клон». Під прапорцем залишається тільки те, що робить оригінал, — найчастіше сховатися і запустити цикл створення.

Межа в триста клонів

Друге правило, про яке Scratch не попереджає. Одночасно в проєкті може існувати до трьохсот копій. Коли ліміт досягнуто, блок створення просто нічого не робить — мовчки, без помилки й без повідомлення.

Виглядає це так: гра працює добре перші півхвилини, а потім нові кулі перестають з'являтися. Причина майже завжди одна — старі клони нікуди не поділися. Вони вилетіли за край екрана, стали невидимими, але продовжують існувати й займати місце.

Лікується одним рядком: у кінці скрипта копії обов'язково має бути «видалити цей клон». Куля долетіла до краю — видалилася. Ворога підбили — видалився. Звичку дописувати цей блок одразу варто завести з першого ж проєкту з клонами, бо шукати потім причину «чомусь перестало працювати» неприємно.

Власні змінні для кожної копії

Якщо кожному ворогу потрібне своє здоров'я або своя швидкість, змінна має бути створена з варіантом «тільки для цього спрайта». Тоді в кожної копії з'являється власне значення, і вони перестають заважати одна одній.

Загальна змінна в такій ситуації поводиться дивно: влучили в одного ворога — здоров'я зникло в усіх разом, і вони загинули хором. Помилка настільки характерна, що по ній одразу видно, який варіант обрали при створенні.

Зворотний випадок теж буває: рахунок гравця має бути один на всю гру, і робити його локальним не можна, інакше кожна куля нараховуватиме очки сама собі в нікуди.

Як клони спілкуються з рештою проєкту

Копія не має власного способу покликати когось на ім'я, і це спочатку обмежує. Працюють два механізми, і обидва варто знати.

Перший — повідомлення. Блок «передати» чує весь проєкт разом, включно з усіма клонами. Зручно для спільних команд: «гра закінчилася», «почався наступний рівень». Усі копії приймають повідомлення одночасно, і кожна робить з ним що належить — зазвичай видаляє себе.

Другий — загальні змінні. Клон може додати собі очко в загальний рахунок, і це побачить уся гра. Саме так влаштована більшість проєктів зі стрільбою: куля-клон долетіла до ворога, додала очко в загальну змінну й видалилася.

Чого копія не вміє — звернутися до конкретної іншої копії. Це межа інструмента, і обходити її в Scratch не варто: якщо задача справді вимагає такого, зазвичай вона розв'язується інакше.

Коли клони не потрібні

Не кожне повторення вимагає клонування. Якщо об'єктів три-чотири й поводяться вони по-різному, простіше й зрозуміліше зробити окремі спрайти. Клони виграють там, де копій багато і поводяться вони однаково.

Є і проміжний варіант, про який часто забувають: один спрайт, який швидко перестрибує між місцями, залишаючи слід пером. Для зорепаду або візерунка це дешевше за сотню копій і працює помітно плавніше.

Прийом: оригінал-невидимка

Стандартна схема, яку варто показати одразу цілком. Оригінал ховається на старті й більше ніколи не з'являється — він працює фабрикою. Усе, що бачить гравець, — це копії.

Робиться це так: під прапорцем оригінал ховається і входить у цикл, де чекає, ставить себе у випадкову точку і створює клон. Під шапкою клона копія показується, рухається і наприкінці видаляє себе.

Один нюанс: оскільки видимість успадковується, схований оригінал дає схованих копій. Тому першим рядком у скрипті клона майже завжди стоїть «показатися». Забути його — класика, і виглядає це як «клони не створюються», хоча вони є, просто невидимі.

Як подивитися, скільки копій зараз у грі

Прямого блока «скільки клонів» у Scratch немає, і це незручно саме тоді, коли підозрюєш витік. Робиться лічильник руками: загальна змінна, яка збільшується на одиницю в скрипті клона і зменшується перед видаленням.

Віконце цієї змінної варто вивести на сцену під час налагодження. Якщо число росте й не падає — копії не видаляються, і до трьохсот справа дійде за хвилину. Якщо число коливається навколо десятка — усе гаразд.

Прийом виглядає дрібним, але він з тієї ж родини, що й перевірка позиції віконцем змінної: замість здогадок про поведінку програми дитина отримує число, яке видно. Саме цього не вистачає більшості проєктів, які «чомусь гальмують».

Не забудьте обнулити лічильник на старті — інакше він успадкує значення з минулого запуску й покаже неправду.

Три помилки, які повторюються

Перша: клони створюються в циклі без паузи. За частку секунди їх стає триста, ліміт вичерпано, гра підвисає. Блок очікування всередині циклу обов'язковий.

Друга: «видалити цей клон» стоїть посеред скрипта, до того, як копія щось зробила. Клон зникає миттєво, і здається, що він не з'являвся зовсім.

Третя: перевірка зіткнень написана в оригіналі, а не в клоні. Оригінал схований і стоїть на місці, тому нічого не ловить, а копії при цьому перевірок не мають. Перевіряти має кожна копія сама за себе.

Клони щільно пов'язані зі змінними — про них є окремий довідник, а рух копій по сцені зручніше розуміти після координат. Повний перелік блоків за категоріями зібраний у довіднику блоків.