Обучение и тренировки · 10 мин
Как сделать бильярд в Scratch
Создайте симуляцию бильярда в Scratch: планирование, спрайты, физика движения, столкновения шаров, управление кием и подсчёт очков.
Scratch — визуальная среда программирования, в которой можно собрать игру «Бильярд» без написания текстового кода. Вместо сложных формул используются блоки, но физика столкновений всё равно требует аккуратной реализации. В этой статье вы пройдёте путь от пустого проекта до играбельной симуляции: создадите стол, шары, научите их двигаться с трением, отскакивать от бортов и сталкиваться друг с другом, а также добавите управление кием и лузы.
Готовый проект будет иметь ограниченную точность: Scratch не поддерживает настоящую физику, поэтому мы используем упрощённые алгоритмы. Однако для обучения и демонстрации базовых принципов этого достаточно. Вы получите рабочую игру, которую можно расширять — добавлять звуки, уровни сложности или режим для двух игроков.
Планирование игры: что нужно учесть до начала программирования
Прежде чем открывать редактор, определитесь с правилами и механикой. Для простой симуляции достаточно одного игрока, который бьёт белым шаром по цветным. Цель — закатить шары в лузы. Ключевые элементы: стол с бортами и лузами, шары разных цветов, кий для прицеливания и удара.
Физика в Scratch реализуется через изменение координат спрайта с течением времени. Каждый шар должен иметь переменные скорости по осям X и Y. При каждом обновлении кадра (обычно через блок «повторять всегда» или «когда флаг нажат») к координатам прибавляется скорость, умноженная на небольшой коэффициент. Трение моделируется постепенным уменьшением скорости.
Столкновения шаров — самая сложная часть. Для двух кругов одинакового радиуса условие столкновения — расстояние между центрами меньше суммы радиусов. При столкновении нужно обменять компоненты скорости вдоль линии, соединяющей центры. В Scratch это делается через тригонометрию, но можно упростить: считать, что при касании шары просто отталкиваются друг от друга, меняя направления на противоположные. Такой подход даёт приемлемый результат для новичков.
Создание сцены и спрайтов: стол, шары, кий
Начните с фона. Нарисуйте в растровом редакторе Scratch прямоугольник зелёного цвета — это игровое поле. Вокруг него добавьте коричневую рамку — борта. В углах и по середине длинных сторон разместите чёрные круги — лузы. Удобно сделать фон один раз и использовать его как сцену.
Шары создайте как отдельные спрайты. Можно использовать один спрайт и менять его костюмы (разные цвета), но для простоты управления скоростями каждого шара лучше создать несколько спрайтов: «шар-белый», «шар-жёлтый», «шар-красный» и так далее. Каждому спрайту задайте одинаковый размер (например, 20 пикселей в диаметре) и начальную позицию в зоне треугольника, как в настоящем бильярде.
Кий — отдельный спрайт, который должен вращаться вокруг белого шара. Его положение зависит от направления прицеливания. Управление: мышь задаёт направление, а сила удара — отдельная переменная, которую можно увеличивать удержанием пробела или прокруткой колеса.
Движение шаров: скорость, трение, отскоки от бортов
Каждому шару задайте три переменные: скорость X, скорость Y и движется? (булево значение). В цикле «повторять всегда» для каждого шара выполните: если скорость не равна нулю, изменить X на скорость X, изменить Y на скорость Y. Затем уменьшите скорость умножением на коэффициент трения (например, 0.98). Если скорость становится меньше 0.1, обнулите её.
Отскок от бортов: если шар касается края игрового поля (координаты выходят за границы), инвертируйте соответствующую скорость (умножьте на -1). Учтите, что границы — это не сам край сцены, а внутренние края бортов. Определите их координаты (например, X от -200 до 200, Y от -140 до 140). Если шар достигает лузы (координаты близки к центрам луз), он должен исчезнуть или переместиться в специальный «карман» — просто скройте спрайт.
- 1Создайте переменные для каждого шара: скорость X, скорость Y, состояние покоя.
- 2Напишите скрипт для каждого шара: при запуске установить начальные координаты.
- 3В блоке «повторять всегда» обновляйте координаты и применяйте трение.
- 4Добавьте проверку на касание границ — инвертируйте скорость.
- 5Проверьте, что шары останавливаются через несколько секунд.
Столкновения шаров между собой: упрощённая модель
Для пары шаров A и B проверяйте расстояние между их центрами. Если оно меньше суммы радиусов, значит, они столкнулись. В простейшем варианте обменяйте их скорости полностью: скорость X A становится скоростью X B, и наоборот; то же для Y. Это напоминает упругий удар при равных массах, но без учёта направления удара. Для большинства случаев в Scratch этого достаточно.
Чтобы избежать многократного срабатывания при касании, используйте флаг «уже столкнулись» — например, переменную касание, которую устанавливайте в true при столкновении и сбрасывайте, когда расстояние станет больше. Или просто проверяйте, что шары не перекрываются, и сразу раздвигайте их на безопасное расстояние.
Более точная физика требует расчёта вектора столкновения: найдите угол между центрами, разложите скорости на составляющие вдоль и поперёк этой линии, обменяйте только продольные компоненты. Это можно реализовать с помощью блоков «косинус» и «синус», но код станет сложнее. Для учебного проекта упрощённый вариант — разумный компромисс.
Управление кием: прицеливание и сила удара
Кий должен вращаться вокруг белого шара. Направление задаётся положением указателя мыши: вычислите угол между белым шаром и курсором, поверните спрайт кия на этот угол. Сила удара — переменная сила, которую можно увеличивать, удерживая пробел, и уменьшать, удерживая стрелку вниз. Отображайте силу на экране (например, в виде полоски).
Удар происходит по нажатию клавиши (например, «пробел» или клик). При ударе задайте белому шару скорость, направленную под углом кия, пропорциональную силе. Разложите силу на компоненты: скорость X = сила косинус угла, скорость Y = сила синус угла. После удара кий должен отойти в сторону или стать невидимым до следующего хода.
Для многопользовательской игры можно добавить смену хода, но в базовой версии достаточно одного белого шара. Если белый шар закатывается в лузу, он возвращается на исходную позицию.
Сравнение вариантов управления
Подходит для начинающих: направление от курсора, сила удержанием пробела. Простота реализации.
Стрелки для поворота, пробел для удара. Требует дополнительных блоков, но удобно на ноутбуке.
Для планшетов: касание задаёт направление, сила — длительность удержания. Сложнее, но возможно.
Лузы и подсчёт очков: завершение игры
Определите координаты луз: четыре угла и две середины длинных сторон. Если шар оказывается в пределах небольшого радиуса от центра лузы (например, 15 пикселей), он считается забитым. В этом случае скройте спрайт шара и увеличьте счёт игрока. Для белого шара — штраф: возврат на исходную позицию.
Создайте переменную счёт и осталось шаров. При забивании шара увеличивайте счёт на 1 и уменьшайте осталось. Когда осталось станет 0, игра завершается — выведите сообщение «Победа!» или остановите скрипты. Добавьте кнопку «Новая игра», которая сбрасывает все переменные и возвращает шары на стартовые позиции.
Проверьте, что лузы не перекрывают борта: шары, которые катятся вдоль борта, могут застрять. Убедитесь, что радиус лузы меньше расстояния до края стола.
Типичные ошибки и как их избежать
Самая частая ошибка — шары проходят сквозь друг друга из-за слишком большой скорости. Решение: уменьшите приращение координат в каждом кадре (например, не 10, а 2) или используйте цикл с несколькими проверками внутри одного кадра. Другая проблема — шары «дрожат» при столкновении из-за того, что они не раздвигаются после касания. После обнаружения столкновения сразу переместите шары так, чтобы они не перекрывались.
Также часто забывают про трение: без него шары катятся бесконечно. Добавьте коэффициент затухания (0.98–0.99) и условие остановки при минимальной скорости. И наконец, кий может «улетать» при вращении — задайте ему точку поворота в центре белого шара с помощью блока «повернуться вокруг точки» или используйте отдельный спрайт-указатель.
Расширение и настройка проекта
После базовой версии добавьте звуки ударов (в Scratch есть встроенные звуки), эффекты при забивании шара, таймер или ограничение по времени. Можно сделать режим для двух игроков: после каждого удара ход переходит к другому, если белый шар не забит. Для этого используйте переменную игрок и переключайте её.
Если хотите более реалистичную физику, изучите векторные вычисления и реализуйте точный обмен скоростями. В интернете есть готовые примеры проектов Scratch по бильярду — можно разобрать их код и адаптировать под свои задачи. Главное — не бойтесь экспериментировать и сохранять разные версии проекта.
Часто задаваемые вопросы
Сколько времени займёт создание бильярда в Scratch?
У новичка, знакомого с основами Scratch, уйдёт от 3 до 6 часов на простую версию с одним игроком и упрощённой физикой. Если вы уже умеете работать с переменными и циклами, можно уложиться быстрее.
Можно ли сделать точную физику столкновений в Scratch?
Да, но это потребует расчётов векторов, тригонометрических функций и более сложных скриптов. Для учебных целей достаточно упрощённой модели — она даёт правдоподобное поведение.
Как добавить несколько шаров разного цвета?
Создайте несколько спрайтов с одинаковыми скриптами, но разными костюмами и начальными координатами. Можно использовать один спрайт и клонировать его, но тогда сложнее управлять индивидуальными скоростями.
Что делать, если игра тормозит?
Уменьшите количество спрайтов (например, до 6 шаров), снизьте частоту обновления (используйте блок «ждать 0.01»), или упростите проверки столкновений — проверяйте только ближайшие шары.
Как реализовать удар кием без мыши?
Используйте клавиши со стрелками для поворота кия и пробел для удара. Направление задаётся углом, который меняется стрелками, а сила — удержанием пробела.
Можно ли опубликовать проект в интернете?
Да, Scratch позволяет делиться проектами через кнопку «Поделиться». Вы получите ссылку, которую можно отправить друзьям или встроить на сайт.
Что важно запомнить
Бильярд в Scratch строится на трёх китах: движение с трением, отскоки от границ и столкновения шаров. Начните с простой модели, затем улучшайте физику и добавляйте игровые элементы.