Цель и движущееся препятствие
10 минут · 28:00–38:00 в часовом практикуме
Результат задачи: Добавить звезду и метеор, который патрулирует горизонтальную дорожку.
Рабочий файл
Открой game.py в распакованном проекте. Продолжаем файл предыдущей задачи. Python и Arcade уже должны быть установлены. После изменения сохрани и запусти Run → Run Module / F5. Старое игровое окно закрой.
Скачать учебную папку со всеми картинками ↓Что используем в этом блоке
- Знак скорости
- Положительная скорость ведёт вправо, отрицательная — влево.
Подзадача 1 · Создай второй и третий объекты
После координат героя добавь координаты цели и препятствия; после hero загрузи ещё две текстуры.
star_x, star_y = 1070, 540meteor_x, meteor_y = 720, 385meteor_speed = 200star = arcade.load_texture("assets/star.png")meteor = arcade.load_texture("assets/meteor.png")Как работает блок
- Запись a, b = 1, 2 присваивает двум именам два значения.
- У каждого объекта отдельные координаты. Высота метеора постоянна, меняется только meteor_x.
Подзадача 2 · Нарисуй оба объекта
Внутри draw после космонавта добавь два вызова уже написанной функции.
draw_image(star, star_x, star_y, 90)draw_image(meteor, meteor_x, meteor_y, 132)Как работает блок
- Меняются текстура, координаты и размер. Новая функция рисования для каждого PNG не требуется.
Подзадача 3 · Запусти патруль
В update добавь global meteor_x, meteor_speed. В конце функции добавь движение и два разворота.
meteor_x += meteor_speed * delta_timeif meteor_x > 1110: meteor_x = 1110 meteor_speed = -200elif meteor_x < 340: meteor_x = 340 meteor_speed = 200Как работает блок
- Справа скорость становится отрицательной, слева положительной.
- Позицию возвращаем точно на границу, чтобы объект не накапливал выход за неё.
- Внутри update весь этот блок сдвинут на четыре пробела.

Самостоятельная модификация
- Подбери скорость патруля. Меняй начальное значение и оба значения на разворотах согласованно.
Критерий готовности
- На экране три объекта; метеор разворачивается у обеих границ; звезда остаётся на месте.
Полный game.py после задачи 4
Сверь расположение блоков или скачай файл в корень распакованного проекта рядом с assets. Это полная рабочая версия на данном этапе.
Скачать game.py задачи 4 ↓Посмотреть весь файл
import arcadeWIDTH = 1280HEIGHT = 800x = 210y = 235SPEED = 270keys = set()star_x, star_y = 1070, 540meteor_x, meteor_y = 720, 385meteor_speed = 200window = arcade.Window(WIDTH, HEIGHT, "Звезда и Метеор")background = arcade.load_texture("assets/background.png")hero = arcade.load_texture("assets/astronaut.png")star = arcade.load_texture("assets/star.png")meteor = arcade.load_texture("assets/meteor.png")def draw_image(texture, x, y, size): arcade.draw_texture_rect(texture, arcade.XYWH(x, y, size, size))def draw(): window.clear() arcade.draw_texture_rect(background, arcade.LBWH(0, 0, WIDTH, HEIGHT)) draw_image(hero, x, y, 132) draw_image(star, star_x, star_y, 90) draw_image(meteor, meteor_x, meteor_y, 132)def key_pressed(key, modifiers): keys.add(key)def key_released(key, modifiers): keys.discard(key)def update(delta_time): global x, y global meteor_x, meteor_speed if arcade.key.RIGHT in keys: x += SPEED * delta_time if arcade.key.LEFT in keys: x -= SPEED * delta_time if arcade.key.UP in keys: y += SPEED * delta_time if arcade.key.DOWN in keys: y -= SPEED * delta_time x = max(96, min(1184, x)) y = max(171, min(589, y)) meteor_x += meteor_speed * delta_time if meteor_x > 1110: meteor_x = 1110 meteor_speed = -200 elif meteor_x < 340: meteor_x = 340 meteor_speed = 200window.on_draw = drawwindow.on_key_press = key_pressedwindow.on_key_release = key_releasedwindow.on_update = updatewindow.on_deactivate = keys.cleararcade.run()Преподавателю: объяснение блока и запись видео
Начните так: «Используем прежний код рисования для двух новых объектов. Отличие метеора — собственная скорость и правило разворота.»
Спросите: Что будет, если у правой границы оставить положительную скорость?
Ответ: Метеор не полетит обратно влево; будет упираться в правую границу.
Если не получается: Пока касания ничего не делают — проверка будет в следующем блоке. Если метеор не движется, проверьте global и расположение кода внутри update.
Открыть сценарий блока →