Тема 2 из 6

Окно и рисование

arcade — современная библиотека для 2D-игр на Python. Она рисует через видеокарту (OpenGL), поэтому быстро справляется с тысячами спрайтов, и в ней сразу есть всё для платформеров: физика, камера, карты уровней.

Как и в курсе pygame, вы будете чинить готовые игры: в каждой задаче работающая программа, в которой сломан небольшой участок.

Минимальная игра

В arcade игра — это класс-наследник arcade.Window. Движок сам крутит игровой цикл и вызывает ваши методы:

import arcade


class Game(arcade.Window):
    def __init__(self):
        super().__init__(800, 600, "Моя игра")        # окно 800 × 600
        self.background_color = arcade.color.SKY_BLUE

    def on_update(self, delta_time):                  # логика: ~60 раз в секунду
        pass

    def on_draw(self):                                # рисование кадра
        self.clear()
        arcade.draw_circle_filled(400, 300, 50, arcade.color.YELLOW)


Game()
arcade.run()
  • on_draw — нарисовать кадр. Начинается с self.clear(): стереть прошлый кадр.
  • on_update(delta_time) — обновить состояние игры. delta_time — сколько секунд прошло с прошлого кадра.
  • on_key_press, on_mouse_press и другие on_… — реакция на клавиатуру и мышь.

Координаты

Главное отличие от pygame: точка (0, 0) — левый нижний угол, y растёт вверх, как на графике в математике.

Если карта уровня записана строками сверху вниз, строку с номером row из rows строк нужно ставить на высоту (rows - 1 - row) * size — верхняя строка окажется наверху.

Рисование

arcade.draw_lrbt_rectangle_filled(left, right, bottom, top, color)   # прямоугольник
arcade.draw_lrbt_rectangle_outline(left, right, bottom, top, color, 2) # рамка толщиной 2
arcade.draw_circle_filled(x, y, radius, color)                        # круг
arcade.draw_line(x1, y1, x2, y2, color, 3)                            # линия толщиной 3
arcade.draw_text("Счёт: 10", x, y, arcade.color.WHITE, 14)            # текст

Цвета — готовые константы arcade.color.RED, arcade.color.GOLD и сотни других, либо кортеж (255, 128, 0).

Каждое следующее рисование ложится поверх предыдущего: фон, потом крупные объекты, потом мелкие и текст.

Полезные функции

arcade.math.clamp(150, 0, 100)    # 100 — ограничить значение отрезком
arcade.math.lerp(0, 10, 0.25)     # 2.5 — точка на четверти пути от 0 до 10

Как проверяются задачи

Код игры запускается под if __name__ == "__main__":. «Запустить у себя» открывает окно игры. При «Отправить» проверка импортирует программу без окна и вызывает ваши функции с разными данными. Поэтому чинить нужно функцию, а не класс окна.

Итог

  • игра — класс-наследник arcade.Window с методами on_draw и on_update, запуск — arcade.run();
  • (0, 0) — левый нижний угол, y растёт вверх;
  • draw_lrbt_rectangle_filled(left, right, bottom, top, color), draw_circle_filled, draw_line, draw_text;
  • arcade.math.clamp ограничивает значение.