2

我的问题sdl2.ext.Renderer主要与我在尝试在sdl2.ext.Window表面上渲染精灵时遇到的问题有关。

所以现在,为了在 SDL2 窗口上着色我的背景,我进行了以下调用:

White = sdl2.ext.Color(255,255,255)

    class Background(sdl2.ext.SoftwareSpriteRenderSystem):
        def __init__(self,window):
            super(Background,self).__init__(window)
            sdl2.ext.fill(self.surface,White)

这会将 Window 的表面着色为白色背景。但是,我也想在屏幕上显示文本。这是通过TextureSprite使用类的from_text方法创建一个来完成的sdl2.ext.SpriteFactory,如下所示:

Renderer = sdl2.ext.Renderer(W) # Creating Renderer

ManagerFont = sdl2.ext.FontManager(font_path = "OpenSans.ttf", size = 14) # Creating Font Manager

Factory = sdl2.ext.SpriteFactory(renderer=Renderer) # Creating Sprite Factory

Text = Factory.from_text("Unisung Softworks",fontmanager=ManagerFont) # Creating TextureSprite from Text

Renderer.copy(Text, dstrect= (0,0,Text.size[0],Text.size[1])) # Resizing the Texture to fit the text dimensions when rendered

运行事件循环时会出现问题。

 running = True
    while running:
        events = sdl2.ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
            if event.type == sdl2.SDL_MOUSEBUTTONDOWN:
                pass

        Renderer.copy(Text, dstrect= (0,0,Text.size[0],Text.size[1]))
        Renderer.present() # Problem 1
        W.refresh() # Problem 2
    return 0

完整示例粘贴

当同时调用 Renderer.present() 和 W.refresh() 时,我会从屏幕上看到闪烁效果。这似乎是因为渲染器覆盖了白色窗口表面,然后通过 Window.refresh() 调用再次着色。然后重复,导致闪烁的混乱。

我想知道我能做些什么来解决这个问题?我是否应该同时使用 Window.refresh() 和 Renderer?有没有办法让一个渲染另一个?(例如渲染器渲染背景)。如果有人可以帮助我,那就太好了。

4

1 回答 1

1

问题是您Window.refresh()与 aSDL_Renderer和 a SoftwareSpriteSystemwithSDL_Texture对象一起使用。

正如 PySDL2 文档中所述,这很可能会中断(因为软件表面缓冲区与基于硬件的纹理混合在一起),您应该避免它。如果你想为窗口背景着色,你应该使用Renderer.clear(White)而不是你的Background类并在通过复制文本之前调用它Renderer.copy()

Renderer.clear(White)
Renderer.copy(Text, dstrect= (0,0,Text.size[0],Text.size[1]))
Renderer.present()

不要忘记为您的FontManager. 默认情况下,它使用白色文本颜色,因此您应该将其更改为例如您的Red颜色:

ManagerFont = sdl2.ext.FontManager(font_path = "OpenSans.ttf", size = 14, color=Red)
于 2014-07-12T07:51:31.247 回答