我的问题主要涉及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
当调用Renderer.present()和W.refresh()时,我会从屏幕上获得闪烁效果。 这似乎是因为渲染器会覆盖白色的窗口表面,然后通过Window.refresh()调用重新着色。然后重复,导致闪烁的混乱。
我想知道我能做些什么来解决这个问题?我是否应该同时使用Window.refresh()和Renderer?有没有办法让一个渲染另一个? (渲染器渲染背景)。如果有人能帮助我,那就太好了。
答案 0 :(得分:0)
问题在于您使用Window.refresh()
以及SDL_Renderer
和SoftwareSpriteSystem
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)