Графическая аркада Python + Arcade: один экран, космонавт, звезда и метеор. Стрелки двигают героя, касания определяют исход, R перезапускает раунд. Запуск на компьютере.
Звезда и Метеор: учителю
Практикум по сборке оконной 2D-аркады. Ученик уже видел переменные, if и функции. Мы показываем, как они становятся координатами, движением и правилами игры. С первого блока пишем код.
Что это за проект
Связать знакомый синтаксис с игровыми задачами. Разделить ввод, обновление и рисование; увидеть роль координат, скорости, функций и условий.
Работающий game.py. Ученик находит блок движения, объясняет проверку касания и меняет скорость, стартовую позицию или маршрут.
60 минут при готовой среде и использовании заготовок для служебного кода. Если набор или новая тема требуют больше времени, разделите после третьей задачи на два занятия.
«Сейчас покажу игру, которую мы соберём за шесть задач. В каждой добавим один работающий блок и проверим его. Начинаем с окна и фона».
Подготовьте до занятия
- Пройдите настройку среды. На каждом компьютере откройте finished.py через редактор из окружения с Arcade.
- Скачайте и распакуйте учебный ZIP. game.py и assets должны оставаться рядом. Оконная игра не запускается в браузерной IDE.
- Проверьте стрелки, остановку при отпускании, столкновение, R и победу. В учебной версии раунд начинается сразу, без меню.
- Держите полные файлы lessons/lesson-01.py … lesson-06.py. При отставании копируйте нужное состояние в game.py в корне проекта и продолжайте с правила, которое разбираете.
- Перед стартом спросите, что делают переменная, if и функция. Если это новые темы, часовой формат нужно расширить.
План на час: шесть задач
В каждом блоке: коротко покажите результат, добавьте код по подзадачам, запустите и задайте один вопрос. Самостоятельные модификации можно оставить на продолжение.
Окно и космический фон →
00:00–08:00 · 8 минут. Открыть окно Arcade 1280 × 800 и нарисовать фон из PNG.
Покажите: Покажите готовую игру за 30 секунд. Затем создайте окно, загрузите PNG и подключите draw. Обратите внимание на последнюю строку arcade.run().
- Создай окно
- Загрузи фон
- Нарисуй кадр и запусти
Спросите: Почему картинку загружаем один раз, а рисуем много раз?
Ожидаемый ответ: Файл достаточно прочитать при подготовке. Каждый новый кадр должен заново показать изображение.
Типичная трудность: FileNotFoundError: проверьте распаковку, assets/background.png и запуск из папки проекта. ModuleNotFoundError: открыт Python без Arcade.
Готово, когда: В отдельном окне виден фон; в Shell нет ошибки загрузки файла.
Реплики и код блока 1 →Добавляем космонавта →
08:00–15:00 · 7 минут. Разместить персонажа на фоне и управлять его положением через координаты.
Покажите: Добавьте текстуру и две координаты. Покажите разницу между LBWH для фона и XYWH для персонажа. Вынесите повторяемое рисование в функцию.
- Загрузи PNG и задай позицию
- Сделай функцию рисования объекта
- Покажи героя поверх фона
Спросите: Что изменится при увеличении y на 100?
Ожидаемый ответ: Персонаж поднимется на 100 пикселей; горизонтальная позиция останется прежней.
Типичная трудность: Если персонаж исчез, проверьте вызов после фона, имя файла и попадание координат в окно.
Готово, когда: Персонаж виден на фоне и меняет положение после изменения x или y.
Реплики и код блока 2 →Плавное управление →
15:00–28:00 · 13 минут. Двигать героя стрелками, останавливать при отпускании и ограничить поле.
Покажите: Подключите события и сначала одну стрелку. Проверьте движение и остановку, затем добавьте остальные три направления и границы.
- Запомни нажатия и отпускания
- Обновляй координаты
- Ограничь поле
- Подключи события
Спросите: Почему движение умножается на delta_time, а не просто на один шаг за кадр?
Ожидаемый ответ: Так скорость привязана к секундам, а не к количеству обновлений на конкретном компьютере.
Типичная трудность: Нет остановки — проверьте key_released и его подключение. UnboundLocalError — проверьте global. Не ставьте while True вокруг arcade.run().
Готово, когда: Удержание даёт плавное движение; отпускание останавливает; выйти за поле нельзя.
Реплики и код блока 3 →Цель и движущееся препятствие →
28:00–38:00 · 10 минут. Добавить звезду и метеор, который патрулирует горизонтальную дорожку.
Покажите: Добавьте две текстуры и вызовы draw_image. После проверки сцены включите патруль и дождитесь обоих разворотов.
- Создай второй и третий объекты
- Нарисуй оба объекта
- Запусти патруль
Спросите: Что будет, если у правой границы оставить положительную скорость?
Ожидаемый ответ: Метеор не полетит обратно влево; будет упираться в правую границу.
Типичная трудность: Пока касания ничего не делают — проверка будет в следующем блоке. Если метеор не движется, проверьте global и расположение кода внутри update.
Готово, когда: На экране три объекта; метеор разворачивается у обеих границ; звезда остаётся на месте.
Реплики и код блока 4 →Столкновения и результат →
38:00–50:00 · 12 минут. Завершать попытку победой или проигрышем и останавливать движение.
Покажите: Разберите touches на двух парах координат. Добавьте состояние и ранний выход; отдельно покажите проигрыш и победу.
- Добавь состояние и подпись
- Опиши проверку близости
- Выбери исход и останови правила
- Покажи результат
Спросите: Почему return стоит в update, а не в draw?
Ожидаемый ответ: Нужно остановить изменение мира, сохранив рисование результата.
Типичная трудность: Если исход меняется повторно, ранний return стоит ниже проверок. Если надпись не видна, проверьте message.draw() и порядок рисования.
Готово, когда: Касание метеора даёт проигрыш, звезды — победу; после исхода герой и метеор стоят.
Реплики и код блока 5 →Перезапуск и проверка игры →
50:00–60:00 · 10 минут. Добавить R для новой попытки и проверить весь игровой цикл.
Покажите: Добавьте restart и R. Пройдите весь проверочный маршрут, затем попросите ученика изменить старт или скорость и объяснить, где ещё нужно поправить значения.
- Собери сброс в функцию
- Подключи R
- Проверь цикл целиком
Спросите: Почему недостаточно вернуть только координаты героя?
Ожидаемый ответ: Метеор, его направление, состояние результата и старый ввод тоже влияют на новый раунд.
Типичная трудность: Если новая попытка сразу завершена, забыли playing. Если герой летит сам, проверьте keys.clear(). Если меняли старт, сверьте значения в двух местах.
Готово, когда: Оба исхода проверены; R работает после каждого; старая нажатая клавиша не переносится в новую попытку.
Реплики и код блока 6 →Как объяснять код по блокам
- Настройки и текстуры. Вверху задаём размеры, координаты и скорости. PNG загружаем один раз после создания окна. Заглавные имена настроек — соглашение Python.
- draw. Очищает кадр и рисует: сначала фон, затем объекты и результат. Положение объектов здесь не меняем. draw_image — обычная написанная нами функция над Arcade.
- События клавиатуры. Нажатие добавляет код в keys, отпускание убирает. Множество хранит несколько направлений без повторов. При потере фокуса очищаем ввод.
- update(delta_time). Считает новую позицию: скорость × секунды. Arcade вызывает функцию регулярно; собственный while True не нужен. global разрешает присваивать новые значения координатам уровня файла.
- Касание и состояние. touches возвращает True или False. Сравниваем расстояния по двум осям; оба условия должны выполниться. state выбирает playing, won или lost, а ранний return останавливает расчёты после исхода.
- restart. Сбрасывает изменяемые данные раунда и старый ввод. Начальные координаты и скорость должны совпадать с настройками сверху.
Вся учебная логика и рисование находятся в одном game.py, с прямыми вызовами Arcade. Отдельные служебные модули для этой версии не нужны. Классы можно ввести позже, когда объектов станет больше.
Упрощения для первого занятия: прямоугольная проверка близости центров вместо контура PNG; диагональ быстрее движения по одной оси. Меню, пауза, таймер, звуки и эффекты — возможные следующие задачи. Расширенный прототип скачивается отдельно.
Проверка понимания и завершение
- Ученик показывает ввод, обновление и рисование в своём файле.
- Объясняет, почему герой останавливается после отпускания и почему скорость умножается на время.
- Проверяет оба исхода и новую попытку; меняет одно правило с прогнозом результата.
Закончите коротким показом игры. Для следующей встречи выберите одну механику: WASD, счётчик времени или несколько звёзд. Если времени мало, сначала доведите шесть основных задач до рабочего результата.
