Глава 2 · Оживляем объекты

Цель и движущееся препятствие

10 минут · 28:00–38:00 в часовом практикуме

Результат задачи: Добавить звезду и метеор, который патрулирует горизонтальную дорожку.

Рабочий файл

Открой game.py в распакованном проекте. Продолжаем файл предыдущей задачи. Python и Arcade уже должны быть установлены. После изменения сохрани и запусти Run → Run Module / F5. Старое игровое окно закрой.

Скачать учебную папку со всеми картинками ↓

Что используем в этом блоке

Знак скорости
Положительная скорость ведёт вправо, отрицательная — влево.

Подзадача 1 · Создай второй и третий объекты

После координат героя добавь координаты цели и препятствия; после hero загрузи ещё две текстуры.

Python
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")

Как работает блок

  1. Запись a, b = 1, 2 присваивает двум именам два значения.
  2. У каждого объекта отдельные координаты. Высота метеора постоянна, меняется только meteor_x.

Подзадача 2 · Нарисуй оба объекта

Внутри draw после космонавта добавь два вызова уже написанной функции.

Python
draw_image(star, star_x, star_y, 90)draw_image(meteor, meteor_x, meteor_y, 132)

Как работает блок

  1. Меняются текстура, координаты и размер. Новая функция рисования для каждого PNG не требуется.

Подзадача 3 · Запусти патруль

В update добавь global meteor_x, meteor_speed. В конце функции добавь движение и два разворота.

Python
meteor_x += meteor_speed * delta_timeif meteor_x > 1110:    meteor_x = 1110    meteor_speed = -200elif meteor_x < 340:    meteor_x = 340    meteor_speed = 200

Как работает блок

  1. Справа скорость становится отрицательной, слева положительной.
  2. Позицию возвращаем точно на границу, чтобы объект не накапливал выход за неё.
  3. Внутри update весь этот блок сдвинут на четыре пробела.
Рабочий результат задачи 4: цель и движущееся препятствие.
Рабочий результат задачи 4: цель и движущееся препятствие. Нажми на кадр, чтобы увеличить.

Самостоятельная модификация

  1. Подбери скорость патруля. Меняй начальное значение и оба значения на разворотах согласованно.

Критерий готовности

  • На экране три объекта; метеор разворачивается у обеих границ; звезда остаётся на месте.

Полный game.py после задачи 4

Сверь расположение блоков или скачай файл в корень распакованного проекта рядом с assets. Это полная рабочая версия на данном этапе.

Скачать game.py задачи 4 ↓
Посмотреть весь файл
Python
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.

Открыть сценарий блока →