Как получить доступ к режиму смешивания pySDL2 SoftwareSpriteRenderSystem?

Проблема очень проста. Я хочу изменить Blendmode для моего средства визуализации SDL2 в Python, но я не знаю, как получить доступ к средству визуализации.

В документации PySDL2 указано, что вы можете определить цвета с помощью альфа-канала:

класс sdl2.ext.Renderer

режим наложения. Режим наложения, используемый для операций рисования (заливка и линия). Это может быть значение

. SDL_BLENDMODE_NONE для отсутствия смешивания

. SDL_BLENDMODE_BLEND для альфа-смешивания

. SDL_BLENDMODE_ADD для аддитивного смешения цветов

. SDL_BLENDMODE_MOD для многократного смешивания цветов

Все, что мне нужно, это установить режим наложения SDL_BLENDMODE_BLEND, чтобы я мог использовать альфа-каналы. Моя проблема в том, что я использую SoftwareSpriteRenderSystem.

self.Renderer = self.SpriteFactory.create_sprite_render_system(self.Window)

Здесь нет четкого способа изменить режим наложения. Я могу попробовать сделать следующее:

SDL_SetRenderDrawBlendMode(self.Renderer,SDL_BLENDMODE_BLEND)

Но это возвращает:

ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_SDL_Renderer instance instead of SoftwareSpriteRenderSystem

Может ли кто-нибудь помочь мне, пожалуйста? Я просто хотел бы получить несколько прозрачных спрайтов (спрайты from_rect), но это оказалось сложно, потому что SDL_renderer недоступен.


person Micrified    schedule 31.08.2014    source источник
comment
Ваш вопрос неоднозначен. Вы хотите иметь спрайты, которые содержат альфа-канал, или вы хотите смешивать основные операции рисования и заливки?   -  person Marcus    schedule 01.09.2014
comment
@Marcus Маркус Я хочу, чтобы спрайты содержали альфа-канал. Я использую 'from_color' для создания своих основных форм (не from_rect, мой плохой), поэтому, как бы вы ни установили прозрачность для спрайтов, это то, что мне нужно.   -  person Micrified    schedule 01.09.2014


Ответы (1)


Поскольку вам нужны или нужны спрайты со сплошными цветами, которые содержат альфа-канал, смешивание будет иметь значение только в том случае, если вы действительно визуализируете что-то на экране, и не имеет значения при создании текстур.

Флаги смешивания из вашего первоначального вопроса поддерживаются только в том случае, если вы не используете программный рендеринг. Это означает, что вы должны использовать не SpriteFactory, который предоставляет SoftwareSpriteRenderSystem, а SpriteFactory с типом спрайта TEXTURE.

Краткий пример создания визуализатора и фабрики на основе текстур для окна:

window = sdl2.ext.Window("Test", size=(800,600))
renderer = sdl2.ext.Renderer(window)
#     use renderer.blendmode = ... to change the blend mode
factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer)
rsystem = factory.create_sprite_render_system(window)

Обратите внимание, что вы получите TextureSprite объекты из SpriteFactory, которые не позволяют вам получить доступ к пикселям так же, как SoftwareSprite или SDL_Surface объекты.

Чтобы создать TextureSprite с альфа-каналом, убедитесь, что вы используете 32 бита на пиксель и альфа-маску в вызове factory.from_color().

# Create a solid, quadratic, red texture of 100px in size, using a RGBA color layout.
factory.from_color(0xFF000000, size=(100, 100),
                   masks=(0xFF000000,           # red channel
                          0x00FF0000,           # green channel
                          0x0000FF00,           # blue channel
                          0x000000FF))          # alpha channel
person Marcus    schedule 01.09.2014
comment
Итак, мне нужно использовать TextureSprites для создания прозрачности? У меня есть только программные спрайты в моем графическом интерфейсе. Как мне визуализировать оба, если я использую SoftwareSpriteRenderSystem для визуализации моих спрайтов? - person Micrified; 01.09.2014
comment
Нет, они нужны только в том случае, если вы хотите использовать встроенные функции смешивания средства визуализации SDL. Вы также можете получить альфа-прозрачность для программных спрайтов, используя вызов from_color() выше. - person Marcus; 01.09.2014
comment
Хорошо спасибо. Я раньше не пользовалась масками. Это решение. Теперь я могу изменить альфа-канал, чтобы получить результат. Потрясающий. Похоже, однако, что вы не можете сделать само окно прозрачным. Всегда будет черный ящик, представляющий размер окна. Понятное ограничение. - person Micrified; 01.09.2014