Первые проекты в Scratch ребёнок делает блоками «идти 10 шагов» и «повернуть на 15 градусов». Работает это до тех пор, пока спрайт не надо поставить в конкретное место. Тогда появляются блоки с x и y, а вместе с ними вопросы, на которые сам Scratch ответа не даёт: почему восемьдесят выше двухсот, почему минус — это влево и где вообще ноль.
Разберём сцену как карту. Это одна из тех тем, после которой проекты ребёнка перестают быть «спрайт бежит куда попало» и становятся точными: кнопки стоят где надо, персонаж появляется в известной точке, а игра не ломается от того, что кто-то выбежал за край.
Сцена — это лист с нулём посередине
Сцена Scratch всегда одинаковая: 480 единиц в ширину и 360 в высоту. Ноль не в углу, как на экране компьютера, а точно в центре. Из-за этого половина значений получается отрицательной, и именно это сначала сбивает с толку.
| Место на сцене | x | y |
|---|---|---|
| Центр | 0 | 0 |
| Правый край | 240 | 0 |
| Левый край | -240 | 0 |
| Верх | 0 | 180 |
| Низ | 0 | -180 |
| Правый верхний угол | 240 | 180 |
| Левый нижний угол | -240 | -180 |
Запоминать эту таблицу не нужно — достаточно один раз провести спрайт по четырём углам и посмотреть, какие числа показывает панель. Для ребёнка это первый случай, когда отрицательные числа означают что-то видимое, а не абстракцию из учебника, и именно поэтому тема заходит легче школьного варианта.
Полезно сразу сказать и про границу: за край сцены спрайт полностью не выходит, Scratch придерживает его так, чтобы часть оставалась видимой. Поэтому задать x в тысячу можно, а поедет спрайт всё равно к краю — не ошибка, а защита от потери персонажа.
Блоки, которые работают с координатами
| Блок | Что делает |
|---|---|
| перейти в x: y: | ставит спрайт в точку мгновенно |
| плавно за 1 с перейти в x: y: | то же, но с анимацией |
| изменить x на 10 | сдвиг вправо от текущего места |
| изменить y на -10 | сдвиг вниз от текущего места |
| задать x значение 0 | ставит только горизонталь |
| задать y значение 0 | ставит только вертикаль |
| перейти в случайную позицию | бросает спрайт в произвольную точку |
| позиция x | возвращает текущее число для проверок |
| позиция y | то же по вертикали |
Главная разница в этой таблице — между «перейти» и «изменить». Первое задаёт место, второе добавляет к нему. Блок «изменить x на 10» внутри цикла даёт движение, а «перейти в x: 10» внутри того же цикла не даст ничего: спрайт просто каждый раз возвращается в одну точку. Перепутать эти два блока — самая частая причина, почему персонаж «не ходит».
Две последние строки — не команды, а значения, и они самые ценные для игр. Из них складываются проверки: если позиция x больше 200, отбить мяч; если позиция y меньше -150, персонаж упал. Без них игра не умеет реагировать на то, где находится спрайт.
Направление живёт по другим правилам
Здесь ловушка, которую не ожидаешь. Координаты в Scratch обычные, математические, а углы — нет. В Scratch ноль градусов смотрит вверх, 90 — вправо, 180 — вниз, а -90 или 270 — влево. В школьной математике всё иначе: ноль смотрит вправо, и отсчёт идёт против часовой стрелки.
Из-за этого ребёнок, который уже видел углы на уроках, ставит 0 и ждёт движения вправо, а спрайт едет вверх. Объяснять здесь лучше не словами: дать блок «повернуть в направлении» и четыре значения, пусть посмотрит сам. После этого путаницы не бывает.
Вторая особенность — блок «идти 10 шагов» двигает спрайт туда, куда он смотрит. То есть шаг зависит от направления, а изменение x — нет. Для простой аркады удобнее второй способ: он не зависит от того, поворачивался ли персонаж.
Почему спрайт стоит не там, где поставили
Ребёнок ставит x и y в ноль, а спрайт оказывается сбоку от центра. Причина не в координатах: они указывают не на рисунок, а на центр костюма — ту точку внутри спрайта, от которой всё отсчитывается. Если персонаж нарисован в углу полотна, центр остаётся посередине полотна, и видимая часть оказывается в стороне.
Лечится в редакторе костюмов: выделить рисунок и перетащить его так, чтобы нужная точка оказалась в перекрестье посередине. Для персонажа это обычно середина тела, а для стрелки или ракеты — её хвост, потому что вращаться она должна вокруг него. Это тот случай, когда двухминутная правка костюма снимает задачу, которую иначе пытаются решить кодом.
Как подсмотреть координаты во время игры
Самый простой способ — перетащить спрайт мышкой и посмотреть на панель под сценой: там всегда показаны его текущие x и y. Так ребёнок за минуту находит числа для любого места, вместо того чтобы угадывать их в коде.
Второй способ нужен, когда игра уже работает и что-то в ней идёт не так. Выведите блоки «позиция x» и «позиция y» на сцену галочкой рядом с ними — числа начнут показываться поверх игры и будут меняться в реальном времени. Видно сразу: спрайт застрял на краю, уехал в минус или стоит на месте, хотя должен двигаться.
Этот приём стоит показать раньше, чем кажется нужным. Он превращает поиск ошибки из гадания в наблюдение, и это тот же подход, которым потом пользуются в текстовых языках, только там вместо галочки пишут вывод в консоль.
Где поставить интерфейс
Когда в проекте появляются кнопки, таблички с очками и надписи, координаты становятся способом разложить экран. Рабочие ориентиры простые: строку с очками удобно держать вверху слева, где-то около x -180 и y 150, кнопку «начать» — в центре чуть ниже нуля, подсказки — внизу, чтобы они не перекрывали действие.
Числа здесь не священные, и подбирать их на глаз совершенно нормально. Важнее другое: как только места заданы числами, а не перетаскиванием мышкой, проект можно открыть через месяц и поправить раскладку, не сбивая всё остальное. Спрайт, посаженный мышкой, при следующей правке уедет, и вернуть его точно туда же будет уже нечем.
Полезная привычка — держать границу в 20 единиц от края. Спрайт, поставленный вплотную к 240, на некоторых экранах выглядит обрезанным, и игру потом приходится править по всему проекту.
Где спотыкаются чаще всего
Первое: знак у y. Чтобы опустить спрайт, нужно вычесть, то есть «изменить y на -10». Половина детей пишет плюс и удивляется, что персонаж прыгает в небо вместо того, чтобы падать.
Второе: координаты другого размера. Если спрайт увеличить вдвое, его координаты не меняются — движение на 10 остаётся движением на 10, хотя шаг визуально выглядит меньше относительно большой фигуры. Числа сцены никак не связаны с масштабом спрайта.
Третье: несколько клонов и одна переменная. Когда в игре десять клонов, а позицию хранят в общей переменной, они мешают друг другу. Нужна переменная «только для этого спрайта» — в Scratch это отдельный выбор при создании, и пропустить его легко.
Три задачи, чтобы проверить себя
Первая: провести спрайт по всем четырём углам сцены и вернуть в центр, без блока случайной позиции. Вторая: нарисовать пером квадрат со стороной 100, начиная с центра — здесь сразу выяснится, понятна ли разница между «перейти» и «изменить». Третья: сделать так, чтобы спрайт, доехав до правого края, появлялся у левого; это уже проверка на умение читать позицию, а не только её задавать.
Если какая-то из трёх занимает больше десяти минут, дело почти всегда не в координатах, а в том, какой блок выбран. Перечень блоков по категориям мы собрали в отдельном справочнике, а о том, когда от Scratch пора переходить к текстовому языку, есть разбор Scratch и Python.