python/pygame 图片闪烁解决方式

在写小游戏的时候,我在屏幕上加载了一个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的,至少我的图片没有闪?

你可能感兴趣的:(python课后练习)