Как сделать платформер: скорость падения, прыжок, уровни и проигрыш

Scratchобновлено 07.10.20269 мин чтения

Платформер в Scratch — игра, где герой бегает по платформам, прыгает и падает вниз под действием гравитации. Секрет всей механики в одной переменной «скорость y»: каждый кадр она уменьшается, и герой летит вниз всё быстрее, а прыжок просто делает её большой и положительной. Ниже — пошаговая сборка от падения до монет и проигрыша.

Из чего состоит платформер в Scratch

Платформер собирается из 4 частей: гравитация, которая тянет героя вниз, проверка земли под ногами, прыжок и движение влево-вправо. Монеты, враги и уровни добавляются потом поверх этого ядра.

В отличие от игры-лабиринта в Scratch, где герой двигается одинаково во все стороны, в платформере вертикаль и горизонталь живут по разным правилам. По горизонтали герой идёт ровно, пока нажата стрелка. По вертикали он всё время падает, и остановить падение может только платформа. Поэтому скрипт героя удобно делить на две половины: одна отвечает за ось x, другая — за ось y.

Такой проект часто становится первой «настоящей» игрой ребёнка. Он сложнее лабиринта, потому что требует переменной, которая меняется каждый кадр, и нескольких вложенных условий. Создатели Scratch из MIT Media Lab называют этот путь «низким порогом и высоким потолком»[1]: сначала герой просто падает, а через несколько вечеров платформер обрастает уровнями и врагами.

Удобный порядок сборки, который не даёт запутаться:

  1. Падение. Герой падает с ускорением и улетает за край — значит, гравитация работает.
  2. Пол. Герой останавливается на зелёной платформе и не проваливается.
  3. Прыжок. Стрелка вверх подбрасывает героя, но только с земли.
  4. Бег. Стрелки влево и вправо, стены другого цвета.
  5. Игра. Монеты, жизни, проигрыш и второй уровень.

После каждого шага платформер в 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−145Короткий прыжок, точная игра
12−166Удобно для первого уровня
15−1105Высокий прыжок, легко перелетать препятствия
8−0.560Плавный, «лунный» прыжок

Сцена 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: первые игры там текстовые, но логика та же.