Урок 10. Работа с поверхностными объектами (часть 1)

Мы уже загружали изображения с помощью pygame.image.load. Например, Урок 4. Создаем Hello, World! в графике.Pygame.image.load определяет название загружаемого изображения и возвращает поверхностный объект (Surface object). Как только поверхностный объект оказалcя загруженным в буфер экрана можно рисовать на нем, трансформировать его и т.д.

Создание поверхности

Один из вариантов создания поверхности – вызов pygame.image.load. Pygame.image.load создает поверхность, которая соответствует цветам и размерам файла, также можно создать пустую поверхность любого размера. Для создания пустой поверхности необходимо вызвать конструктор pygame.Surface, который содержит требуемые размеры. Например, blank_surface = pygame.Surface ((256, 256)) создает поверхность с размером 256х256 пикселей. Если мы не определим никаких других параметров, то получим поверхность с тем количеством цветов что и наш дисплей.

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

HWSURFACE – создает “аппаратную” поверхность, которая может работать производительнее. Желательно активировать флаг HWSURFACE и предоставить Pygame самому решать, когда его использовать.

SRCALPHA – создает поверхность с информацией об альфа-канале. Активировать флаг стоит в случае использования прозрачной поверхности, спрайтов и шрифтов. Флаг также требует установить параметр depth в значение 32.

Следующая строка кода создает поверхность с информацией об альфа-канале: blank_alpha_surface = pygame.Surface ((256, 256), flags=SRCALPHA, depth=32)

Конвертирование поверхности

Когда вы работаете с поверхностными объектами, вам не нужно волноваться об информации изображения, хранящегося в памяти, так как Pygame берет эту проблему на себя. Но не стоит злоупотреблять автоматическим конвертированием, например, при работе с изображениями разных форматов. В противном случае отрисовка игровых объектов будет ухудшена. Выход заключается в конвертации всех изображений в единый формат. Объект Surface для этих целей использует функцию convert.

Если вызвать convert без указания параметров, то поверхность преобразуется в формат поверхности дисплея. Это полезно в случаях быстрого копирования поверхностей, когда исходные данные совпадают по формату с конечными. Лучше всего присоединить .convert() в конец pygame.image.load, чтобы быть уверенным, что изображения быстрее преобразуются в формат дисплея. Пример, background = pygame.image.load (background_image_filename).convert(). Исключение составляют изображения с альфа-каналами, в этом случае convert отбросит альфа-канал. К счастью в Pygame существует функция convert_alpha, конвертирующая поверхность с сохранением альфа-канала. Пример, mouse_cursor = pygame.image.load (mouse_image_filename).convert_alpha().

Прямоугольные объекты

Часто возникают случаи, когда Pygame запрашивает определенную область, чтобы понять на какую часть экрана будет действовать функция. Например, можно ограничить отрисовку части экрана при помощи закрепления области (об этом мы поговорим ниже). Вы можете определить область используя кортеж, который содержит четыре значения: значения координат х и у левого верхнего угла за которыми следуют значения ширины и длины прямоугольника. Например, my_rect1 = (100, 100, 200, 150). Как вариант, вы можете указать значения координат х и у как один кортеж за которым следует другой кортеж, содержащий значения ширины и длины прямоугольника. Например, my_rect2 = ((100, 100), (200, 150)). Какой из методов вы будете использовать, решать вам. Лучше смотреть всегда по коду.

В Pygame присутствует класс Rect, который хранит туже информацию, что и кортеж области, но отличается удобными способами работы. Rect используется настолько часто, что он был включен в pygame.locals.

Чтобы построить Rect объект, мы используем те же самые параметры, что и в кортеже области. Выше были приведены примеры (my_rect1 = (100, 100, 200, 150) и my_rect2 = ((100, 100), (200, 150))), которые в случае использования Rect выглядят следующим образом:

my_rect3 = Rect(100, 100, 200, 150)

my_rect4 = Rect((100, 100), (200, 150))

Закрепление

Часто при создании экрана для игры, нужно отрисовать только часть дисплея. Например, в стратегиях а-ля Command&Conquer верхняя часть экрана используется в качестве прокручивающийся карты, а нижняя часть представляет собой панель, которая отображает информацию об отрядах. Реализовывается это с помощью функции set_clip, которая устанавливает закрепленный участок на поверхности. Если потребуется отыскать текущий закрепленный участок, используется get_clip.

Данное короткое пояснение показывает, каким образом реализовывается закрепление для создания экранов в играх жанра стратегия. Во-первых ,мы закрепляем участок и вызываем draw_map (отрисовывает только верхнюю часть экрана). Во-вторых, вызываем set_clip (закрепляет остальную часть экрана):

screen.set_clip (0, 0, 640, 300)

draw_map ()

screen.set_clip (0, 300, 640, 180)

draw_panel ()

Комментариев нет

xione от октября 25 2009 в изучение pygame

Трэкбек URI | RSS комментариев

Оставить комментарий