Из чего состоит платформер в Scratch
Платформер собирается из 4 частей: гравитация, которая тянет героя вниз, проверка земли под ногами, прыжок и движение влево-вправо. Монеты, враги и уровни добавляются потом поверх этого ядра.
В отличие от игры-лабиринта в Scratch, где герой двигается одинаково во все стороны, в платформере вертикаль и горизонталь живут по разным правилам. По горизонтали герой идёт ровно, пока нажата стрелка. По вертикали он всё время падает, и остановить падение может только платформа. Поэтому скрипт героя удобно делить на две половины: одна отвечает за ось x, другая — за ось y.
Такой проект часто становится первой «настоящей» игрой ребёнка. Он сложнее лабиринта, потому что требует переменной, которая меняется каждый кадр, и нескольких вложенных условий. Создатели Scratch из MIT Media Lab называют этот путь «низким порогом и высоким потолком»[1]: сначала герой просто падает, а через несколько вечеров платформер обрастает уровнями и врагами.
Удобный порядок сборки, который не даёт запутаться:
- Падение. Герой падает с ускорением и улетает за край — значит, гравитация работает.
- Пол. Герой останавливается на зелёной платформе и не проваливается.
- Прыжок. Стрелка вверх подбрасывает героя, но только с земли.
- Бег. Стрелки влево и вправо, стены другого цвета.
- Игра. Монеты, жизни, проигрыш и второй уровень.
После каждого шага платформер в Scratch нужно запускать и проверять, а не собирать все пять частей сразу. Если что-то сломалось, ошибка почти наверняка в последних добавленных блоках. Такой подход совпадает с тем, что Бреннан и Резник называют практиками программирования: делать понемногу, тестировать и отлаживать. Готовый платформер в Scratch, собранный по этому плану, легко дополнять: каждая новая механика — ещё одно условие в цикле героя.
Гравитация через переменную скорости
Гравитация в Scratch — это 2 блока в цикле: «изменить скорость y на −1» и «изменить y на (скорость y)». Скорость с каждым кадром становится всё более отрицательной, и герой падает с ускорением, как настоящий мяч.
Создайте переменную «скорость y» с галочкой «только для этого спрайта» и соберите скрипт героя:
когда щёлкнут по зелёному флагу
перейти в x: (-200) y: (100)
задать [скорость y] значение (0)
повторять всегда
изменить [скорость y] на (-1)
изменить y на (скорость y)
Запустите: герой падает, разгоняется и улетает за нижний край. В исследовании Maloney и соавторов о языке Scratch отмечено, что мгновенный запуск без компиляции помогает детям экспериментировать, — здесь это особенно заметно: поменяли число, нажали флаг, увидели результат. Почему не просто «изменить y на −5»? Тогда падение было бы равномерным, как у лифта. В жизни предметы падают с ускорением, и игрок интуитивно это чувствует. Переменная скорости даёт именно такое движение — в этом и состоит гравитация в платформере.
Число −1 — это «сила тяжести». Попробуйте −0.5: герой станет падать мягко, как на Луне. При −2 он будет падать тяжело и резко. Подбирать гравитацию лучше вместе с силой прыжка — об этом ниже. Готовых «правильных» чисел нет: у каждого платформера в Scratch своя физика, и подбор значений — тоже часть работы автора.
Платформы и проверка земли
Чтобы герой стоял на платформе, после шага по вертикали проверяют «касается цвета [платформы]?»: если да, героя поднимают по одному пикселю, пока касание не исчезнет, и обнуляют скорость.
изменить y на (скорость y)
если <касается цвета [■ зелёный]?> то
повторять пока не <не <касается цвета [■ зелёный]?>>
изменить y на (1)
задать [скорость y] значение (0)
Двойное «не» читается просто: повторять, пока касается. Смысл — выталкивать героя вверх по пикселю, пока он «утоплен» в платформу. Платформы рисуют на фоне одним цветом, как стены в лабиринте, — тогда новая платформа не требует нового кода.
Есть важная деталь: если герой падает слишком быстро, за один кадр он может пролететь тонкую платформу насквозь. Поэтому скорость падения ограничивают: «если скорость y меньше −12, задать скорость y значение −12». Толщина платформ при этом должна быть больше 12 пикселей. Scratch бесплатен: его разрабатывают в MIT Media Lab, а поддерживает Scratch Foundation, так что все опыты с гравитацией можно проводить в браузере без установки.
Прыжок только с земли
Прыжок — это одно присваивание: «задать скорость y значение 12». Но разрешать его нужно только тогда, когда герой стоит на платформе, иначе он будет взлетать по лестнице из прыжков прямо в воздухе.
Проще всего проверять клавишу внутри того же условия, где герой стоит на платформе:
задать [скорость y] значение (0)
если <клавиша [стрелка вверх] нажата?> то
задать [скорость y] значение (12)
Высоту прыжка легко посчитать. После прыжка скорость каждый кадр уменьшается на 1: герой поднимается на 11, потом на 10, 9… до нуля. Сумма 11 + 10 + … + 1 = 66 пикселей. Значит, при гравитации −1 и прыжке 12 герой допрыгнет до платформы, которая выше примерно на 60 пикселей.
| Сила прыжка | Гравитация | Высота прыжка, пикселей | Ощущение |
| 10 | −1 | 45 | Короткий прыжок, точная игра |
| 12 | −1 | 66 | Удобно для первого уровня |
| 15 | −1 | 105 | Высокий прыжок, легко перелетать препятствия |
| 8 | −0.5 | 60 | Плавный, «лунный» прыжок |
Сцена Scratch имеет высоту 360 пикселей, поэтому уровни с прыжком 66 удобно строить «лестницей» из 4–5 этажей. Если ребёнок хочет двойной прыжок, понадобится вторая переменная-счётчик прыжков, которая обнуляется при касании платформы.
Движение влево-вправо и стены
По горизонтали герой двигается обычным «изменить x на 4» при нажатой стрелке. Чтобы он не проходил сквозь стены, их рисуют другим цветом и после шага по x проверяют касание этого цвета с откатом назад.
если <клавиша [стрелка вправо] нажата?> то
изменить x на (4)
если <касается цвета [■ коричневый]?> то
изменить x на (-4)
Почему стены другого цвета? Если стены того же зелёного цвета, что и платформы, проверка земли примет стену за пол и вытолкнет героя вверх — он начнёт «взбегать» по вертикальным стенам. Отдельный цвет решает проблему без сложных вычислений. Как устроены переменные «только для этого спрайта» и «для всех», подробно разобрано в уроке про переменные в Scratch.
Монеты, жизни и проигрыш
Монеты делают отдельным спрайтом, который при касании героя прибавляет 1 к переменной «счёт» и прячется. Проигрыш наступает при касании «лавы» или падении ниже y = −170 — тогда отнимается жизнь и герой возвращается на старт.
(скрипт монеты)
когда щёлкнут по зелёному флагу
показаться
ждать до <касается [Герой]?>
изменить [счёт] на (1)
включить звук [Монета]
спрятаться
(в цикле героя)
если <<касается цвета [■ красный]?> или <(положение y) < (-170)>> то
изменить [жизни] на (-1)
перейти в x: (-200) y: (100)
задать [скорость y] значение (0)
Когда монет много, удобно сделать их копиями одного спрайта: оригинал прячется и создаёт клоны в нужных точках. Это экономит время и код — подробности в уроке про клоны в Scratch. Конец игры — отдельный скрипт: «ждать до жизни = 0 → переключить фон на “Игра окончена” → стоп все».
В этом проекте ребёнок работает с данными и операторами: счёт, жизни, сравнения, логическое «или». Бреннан и Резник относят данные и операторы к ключевым понятиям вычислительного мышления[2], а в школе переменные и составные условия по федеральной образовательной программе изучают в 8 классе[3].
Когда платформер не подходит
Платформер не подходит как самый первый проект: он требует уверенности в переменных и условиях. В этих ситуациях лучше начать с другого.
- Ребёнок сделал меньше 2 проектов в Scratch. Начните с анимации или лабиринта, где нет гравитации.
- Ребёнку 6–7 лет. Переменная, меняющаяся каждый кадр, обычно ещё сложна; подойдут ScratchJr и простые истории.
- Нужна карта шире 480 пикселей с прокруткой. Это отдельная техника со смещением всех объектов — оставьте её на второй проект.
- На проект есть 1 короткое занятие. Ядро игры собирается за 40–60 минут, а без доделки впечатление будет «не работает».
Мифы о самодельных играх
Миф о том, что для игр с физикой нужна «настоящая» математика, отпугивает многих. Разберём 2 распространённых заблуждения.
Миф: «гравитацию в игре невозможно сделать без формул из физики старших классов». Это не подтверждается: в Scratch хватает одной переменной и вычитания единицы каждый кадр. Ускорение получается само.
Миф: «если ребёнок делает игры, он будет только играть». Прямой связи не существует: собирая игру, ребёнок придумывает правила, ищет ошибки и проверяет гипотезы — это работа программиста, а не игрока.
Если ребёнок мечтает делать игры, полезно знать, как этот путь выглядит дальше: о нём — в материале «ребёнок хочет делать игры». По справке Scratch Foundation, среда рассчитана прежде всего на 8–16 лет[4], и игры с гравитацией вполне по силам её аудитории.
Чего делать нельзя
Нельзя менять y героя напрямую на постоянное число вместо скорости — исчезнет ощущение падения. Остальные правила ниже.
- Нельзя разрешать прыжок без проверки земли: герой улетит, многократно нажимая стрелку в воздухе.
- Не стоит красить стены и пол одним цветом — герой начнёт взбираться по стенам.
- Не следует оставлять скорость падения без ограничения: герой пролетит тонкие платформы.
- Не стоит делать платформы тоньше 12 пикселей, если скорость ограничена числом 12.
- Нельзя забывать обнулять скорость при возвращении на старт — герой сразу полетит вниз с прежней скоростью.
- Не стоит копировать готовую физику целиком, не разобрав её: при первой ошибке её будет невозможно исправить.
Источники
[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] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[4] Scratch Foundation. Scratch: For Parents (раздел справки Scratch).
Вопросы и ответы
Почему герой проваливается сквозь платформу?
Скорость падения больше толщины платформы, и за один кадр герой её перескакивает. Ограничьте скорость или сделайте платформы толще.
Почему герой дрожит, стоя на платформе?
Так бывает, когда скорость не обнуляется после касания. Каждый кадр герой опускается и снова выталкивается вверх. Проверьте блок «задать скорость y значение 0».
Как сделать платформер в Scratch с несколькими уровнями?
Нарисуйте несколько фонов и переключайте их, когда герой касается выхода с уровня. Монеты и врагов показывайте по сообщению о смене уровня.
Как сделать движущуюся платформу?
Сделайте её отдельным спрайтом, который «плывёт» туда-обратно, и проверяйте у героя касание этого спрайта так же, как касание цвета.
Сколько времени занимает первый платформер?
Ядро с гравитацией и прыжком — одно-два занятия. Уровни, монеты и экран проигрыша обычно добавляются ещё за несколько вечеров.
Что изучать после платформера?
Если хочется усложнять игры, освойте списки и прокрутку карты. Если тянет к тексту, попробуйте Python: первые игры там текстовые, но логика та же.