在写小游戏的时候,我在屏幕上加载了一个sprite,但是只有这个图片会一直闪烁,其他东西都很流畅。百度了一下竟然没人讲到相关的解决办法,于是在谷歌上搜了一下,发现有一个答案能解决我的问题。造成这个问题的原因很简单:程序中重复出现多个pygame.display.update()(或者pygame.display.flip() ),只能有一个。
这是我没有调整之前的部分代码,像这样的就会闪烁:
framerate = pygame.time.Clock()
group = pygame.sprite.Group()
group.add(mysprite)
framerate.tick(60)
while True:
gf.check_events(ai_settings, screen, char, stats, sb, play_button, quit_button, background, enemies, mysprite)
if stats.game_active:
gf.update_enemies(ai_settings, screen, sb, stats, char, background, enemies, play_button, quit_button)
ticks = pygame.time.get_ticks()
group.update(ticks)
group.draw(screen)
pygame.display.update()
gf.update_screen(ai_settings, screen, stats, sb, play_button, quit_button, aim, background, char, enemies, mysprite)
重点是上面循环体里面有一个pygame.display.update(),在update_screen里面又有一个pygame.display.flip(),于是运行造成图片闪烁。
经修改,删除update_screen中的pygame.display.flip(),调整位置,只剩下一个pygame.display.update()之后,图片不再闪烁:
framerate = pygame.time.Clock()
group = pygame.sprite.Group()
group.add(mysprite)
framerate.tick(60)
while True:
gf.check_events(ai_settings, screen, char, stats, sb, play_button, quit_button, background, enemies, mysprite)
gf.update_screen(ai_settings, screen, stats, sb, play_button, quit_button, aim, background, char, enemies, mysprite)
if stats.game_active:
gf.update_enemies(ai_settings, screen, sb, stats, char, background, enemies, play_button, quit_button)
ticks = pygame.time.get_ticks()
group.update(ticks)
group.draw(screen)
pygame.display.update()
当然造成这个问题的不止一个原因,以后遇见的话再记录下来吧。
参考答案:https://stackoverflow.com/questions/48308074/why-are-my-images-flickering-pygame/48322805#48322805?newreg=415eab4b5f85421ea0a5880297d8e509
作者是:skrx
(以及我修改完之后,整个游戏的速度变慢了?是帧率的问题么?我把帧率从60改成120,才稍微好了一点。)
——————————————分割线——————————————————————————
2019/4/29 更新:
我在game_functions.py文件中写了一个让角色行走起来的时候角色会动的函数,在里面使用了pygame.display.update()。在主程序中调用它,代码如下:
while True:
gf.check_events(ai_settings, screen, char, stats, sb, play_button, quit_button, background, enemies)
gf.update_screen(ai_settings, screen, stats, sb, play_button, quit_button, aim, background, char, enemies)
if stats.game_active:
gf.update_enemies(ai_settings, screen, sb, stats, char, background, enemies, play_button, quit_button)
if background.bg_x >-400 and background.bg_x<=0:
mysprite.load("images/baby_72x36x3.png", 72, 36, 3)
gf.char_walking(screen, mysprite, char)
elif background.bg_x <-400 and background.bg_x >-1200:
char.update_stage1(screen, background)
mysprite.update_stage1(char)
mysprite.load("images/child_48x72x4.png", 48, 72, 4)
gf.char_walking(screen, mysprite, char)
pygame.display.update()
game_functions.py
def char_walking(screen, mysprite, char):
framerate = pygame.time.Clock()
group = pygame.sprite.Group()
group.add(mysprite)
framerate.tick(120)
ticks = pygame.time.get_ticks()
group.update(ticks)
group.draw(screen)
pygame.display.update()
也就是说,现在有两个display.update()了,图片不仅没有闪烁,在我尝试去掉char_walking函数里面的display.update()时,游戏运行起来帧数反而更低了。(此时只有char_walking的结尾以及主程序结尾有display.update)我推测大概是因为上次的两个display.update是放在同一个层次下面的,都是在while下面。而这次虽然有两个update,但是一个是在while里的if下面,一个是在while,所以大概是可以有两个update的,至少我的图片没有闪?