Поки в проєкті один спрайт на одну річ, усе зрозуміло. Але гра рідко складається з одного ворога: потрібні десять астероїдів, двадцять монет, черга куль. Робити двадцять окремих спрайтів і двадцять однакових скриптів неможливо — щойно знадобиться правка, її доведеться повторити двадцять разів.
Для цього і потрібні клони. Один спрайт описує поведінку, а гра робить з нього скільки завгодно копій, кожна зі своїм життям. Тема вважається складною, хоча блоків у ній усього три; плутанина росте з двох правил, про які ніде не написано великими літерами.
Три блоки, і все
| Блок | Що робить |
|---|---|
| створити клон [себе] | робить копію прямо зараз |
| коли я починаю як клон | шапка скрипта, який виконує копія |
| видалити цей клон | копія зникає назавжди |
Типовий проєкт виглядає так: головний скрипт у циклі створює клони з паузою, а другий скрипт, під шапкою «коли я починаю як клон», описує, що копія робить — летить, падає, рухається до гравця і в кінці видаляє себе.
У випадаючому списку першого блока, крім «себе», перелічені інші спрайти. Це знадобиться рідше, але буває зручно: кнопка на сцені створює клони стріли, а не сама себе.
Що клон отримує в спадок
У момент створення копія забирає в оригіналу все видиме: місце, напрямок, розмір, костюм, ефекти, видимість. Тому поширений прийом — перед створенням клона поставити оригінал туди, де копія має з'явитися, і вже потім клонувати.
Так роблять дощ, зорепад, появу ворогів у випадковій точці: оригінал стрибає в випадкове місце, створює клон і стрибає далі. Сам оригінал при цьому зазвичай схований, і на сцені видно тільки копії.
Разом з виглядом успадковуються і значення змінних — але тільки тих, що створені «тільки для цього спрайта». Загальні змінні в усіх одні, і це наступна частина теми.
Зелений прапорець для клона не працює
Ось перше правило, на якому спотикаються всі. Скрипти під шапкою «коли натиснуто зелений прапорець» у клонів не запускаються ніколи. Прапорець натискають один раз, на початку, і до копій, що з'явилися пізніше, він не має жодного стосунку.
Дитина, яка цього не знає, пише поведінку ворога під прапорцем, бачить, що клони стоять нерухомо, і робить висновок, що клонування не працює. Насправді копії створилися чесно, просто їм ніхто не дав команди.
Правило просте: усе, що має робити копія, живе під шапкою «коли я починаю як клон». Під прапорцем залишається тільки те, що робить оригінал, — найчастіше сховатися і запустити цикл створення.
Межа в триста клонів
Друге правило, про яке Scratch не попереджає. Одночасно в проєкті може існувати до трьохсот копій. Коли ліміт досягнуто, блок створення просто нічого не робить — мовчки, без помилки й без повідомлення.
Виглядає це так: гра працює добре перші півхвилини, а потім нові кулі перестають з'являтися. Причина майже завжди одна — старі клони нікуди не поділися. Вони вилетіли за край екрана, стали невидимими, але продовжують існувати й займати місце.
Лікується одним рядком: у кінці скрипта копії обов'язково має бути «видалити цей клон». Куля долетіла до краю — видалилася. Ворога підбили — видалився. Звичку дописувати цей блок одразу варто завести з першого ж проєкту з клонами, бо шукати потім причину «чомусь перестало працювати» неприємно.
Власні змінні для кожної копії
Якщо кожному ворогу потрібне своє здоров'я або своя швидкість, змінна має бути створена з варіантом «тільки для цього спрайта». Тоді в кожної копії з'являється власне значення, і вони перестають заважати одна одній.
Загальна змінна в такій ситуації поводиться дивно: влучили в одного ворога — здоров'я зникло в усіх разом, і вони загинули хором. Помилка настільки характерна, що по ній одразу видно, який варіант обрали при створенні.
Зворотний випадок теж буває: рахунок гравця має бути один на всю гру, і робити його локальним не можна, інакше кожна куля нараховуватиме очки сама собі в нікуди.
Як клони спілкуються з рештою проєкту
Копія не має власного способу покликати когось на ім'я, і це спочатку обмежує. Працюють два механізми, і обидва варто знати.
Перший — повідомлення. Блок «передати» чує весь проєкт разом, включно з усіма клонами. Зручно для спільних команд: «гра закінчилася», «почався наступний рівень». Усі копії приймають повідомлення одночасно, і кожна робить з ним що належить — зазвичай видаляє себе.
Другий — загальні змінні. Клон може додати собі очко в загальний рахунок, і це побачить уся гра. Саме так влаштована більшість проєктів зі стрільбою: куля-клон долетіла до ворога, додала очко в загальну змінну й видалилася.
Чого копія не вміє — звернутися до конкретної іншої копії. Це межа інструмента, і обходити її в Scratch не варто: якщо задача справді вимагає такого, зазвичай вона розв'язується інакше.
Коли клони не потрібні
Не кожне повторення вимагає клонування. Якщо об'єктів три-чотири й поводяться вони по-різному, простіше й зрозуміліше зробити окремі спрайти. Клони виграють там, де копій багато і поводяться вони однаково.
Є і проміжний варіант, про який часто забувають: один спрайт, який швидко перестрибує між місцями, залишаючи слід пером. Для зорепаду або візерунка це дешевше за сотню копій і працює помітно плавніше.
Прийом: оригінал-невидимка
Стандартна схема, яку варто показати одразу цілком. Оригінал ховається на старті й більше ніколи не з'являється — він працює фабрикою. Усе, що бачить гравець, — це копії.
Робиться це так: під прапорцем оригінал ховається і входить у цикл, де чекає, ставить себе у випадкову точку і створює клон. Під шапкою клона копія показується, рухається і наприкінці видаляє себе.
Один нюанс: оскільки видимість успадковується, схований оригінал дає схованих копій. Тому першим рядком у скрипті клона майже завжди стоїть «показатися». Забути його — класика, і виглядає це як «клони не створюються», хоча вони є, просто невидимі.
Як подивитися, скільки копій зараз у грі
Прямого блока «скільки клонів» у Scratch немає, і це незручно саме тоді, коли підозрюєш витік. Робиться лічильник руками: загальна змінна, яка збільшується на одиницю в скрипті клона і зменшується перед видаленням.
Віконце цієї змінної варто вивести на сцену під час налагодження. Якщо число росте й не падає — копії не видаляються, і до трьохсот справа дійде за хвилину. Якщо число коливається навколо десятка — усе гаразд.
Прийом виглядає дрібним, але він з тієї ж родини, що й перевірка позиції віконцем змінної: замість здогадок про поведінку програми дитина отримує число, яке видно. Саме цього не вистачає більшості проєктів, які «чомусь гальмують».
Не забудьте обнулити лічильник на старті — інакше він успадкує значення з минулого запуску й покаже неправду.
Три помилки, які повторюються
Перша: клони створюються в циклі без паузи. За частку секунди їх стає триста, ліміт вичерпано, гра підвисає. Блок очікування всередині циклу обов'язковий.
Друга: «видалити цей клон» стоїть посеред скрипта, до того, як копія щось зробила. Клон зникає миттєво, і здається, що він не з'являвся зовсім.
Третя: перевірка зіткнень написана в оригіналі, а не в клоні. Оригінал схований і стоїть на місці, тому нічого не ловить, а копії при цьому перевірок не мають. Перевіряти має кожна копія сама за себе.
Клони щільно пов'язані зі змінними — про них є окремий довідник, а рух копій по сцені зручніше розуміти після координат. Повний перелік блоків за категоріями зібраний у довіднику блоків.