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的,至少我的图片没有闪?

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要实现图片闪烁效果,可以使用pygame中的定时器以及透明度调节。 下面是一个简单的示例代码,演示了如何使用pygame实现图片闪烁的效果: ```python import pygame # 初始化pygame pygame.init() # 设置窗口尺寸和标题 screen_width, screen_height = 800, 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Image Blinking") # 加载图片 image = pygame.image.load("image.png") image_rect = image.get_rect() image_alpha = 255 # 初始透明度为255 # 设置定时器事件 BLINK_EVENT = pygame.USEREVENT + 1 pygame.time.set_timer(BLINK_EVENT, 500) # 设置500毫秒触发一次事件 # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == BLINK_EVENT: # 调整透明度 if image_alpha == 255: image_alpha = 0 else: image_alpha = 255 # 填充背景色 screen.fill((0, 0, 0)) # 绘制图片 image.set_alpha(image_alpha) screen.blit(image, image_rect) # 更新屏幕 pygame.display.flip() # 退出游戏 pygame.quit() ``` 在这个示例中,我们首先加载了一张图片,并设置了一个初始透明度为255。然后使用定时器每500毫秒触发一次自定义事件。在事件处理中,通过调整透明度来实现图片闪烁效果。最后,在主循环中绘制图片并更新屏幕,实现了图片闪烁的效果。 你可以将上述代码中的`"image.png"`替换为你自己的图片路径来测试。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值