如何访问pySDL2的SoftwareSpriteRenderSystem混合模式?

1 投票
1 回答
788 浏览
提问于 2025-04-19 01:18

这个问题很简单。我想在Python中为我的SDL2渲染器更改混合模式,但我不知道怎么访问渲染器。

PySDL2的文档提到,你可以定义带有透明度的颜色:

class sdl2.ext.Renderer

blendmode: 用于绘制操作(填充和线条)的混合模式。这可以是以下值:

. 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渲染器,这变得很困难。

1 个回答

1

因为你需要或者想要有实色的精灵,并且这些精灵包含透明度通道,所以混合效果只有在你实际在屏幕上渲染东西时才有意义,而在你创建纹理时就不重要了。

你最开始提到的混合标志只有在你不使用软件渲染的情况下才支持。这意味着你不能使用提供SoftwareSpriteRenderSystemSpriteFactory,而应该使用带有TEXTURE精灵类型的SpriteFactory

下面是一个简单的例子,展示如何为一个窗口创建基于纹理的渲染器和工厂:

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)

请注意,你将从SpriteFactory中获得TextureSprite对象,而这些对象允许你像SoftwareSpriteSDL_Surface对象那样访问像素。

要创建一个带有透明度通道的TextureSprite,确保在你的factory.from_color()调用中使用32位每像素(bpp)和一个透明度掩码。

# 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

撰写回答