PySDL2:渲染器或窗口表面用于处理颜色和文本?

时间:2014-07-12 03:21:27

标签: window renderer pysdl2

我的问题主要涉及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)

使用白色背景为窗口的表面着色。但是,我也想在屏幕上显示文字。这是通过使用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

Full Example Paste

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

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

1 个答案:

答案 0 :(得分:0)

问题在于您使用Window.refresh()以及SDL_RendererSoftwareSpriteSystem SDL_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)