使用PyGame,我得到闪烁的东西。盒子,圆圈,文字,它都闪烁着。我可以通过增加循环之间的等待来减少这种情况,但是我可能可以通过立即将所有内容绘制到屏幕来消除它,而不是单独执行所有操作。以下是我遇到的一个简单示例:
import pygame, time pygame.init() screen = pygame.display.set_mode((400, 300)) loop = "yes" while loop=="yes": screen.fill((0, 0, 0), (0, 0, 400, 300)) font = pygame.font.SysFont("calibri",40) text = font.render("TextA", True,(255,255,255)) screen.blit(text,(0,0)) pygame.display.update() font = pygame.font.SysFont("calibri",20) text = font.render("Begin", True,(255,255,255)) screen.blit(text,(50,50)) pygame.display.update() time.sleep(0.1)
“开始”按钮为我闪烁。它可能只是我较慢的电脑,但有没有办法减少或消除闪烁?在我正在研究的更复杂的事情上,它变得非常糟糕。谢谢!
答案 0 :(得分:3)
您在循环中更新了屏幕2次,一次用于绘制第一个文本(TextA
),另一个用于第二个文本(Begin
)。
首次更新后,只会显示第一个文字,因此您无法在第一次更新和第二次更新之间看到begin
文字。这会导致闪烁。
绘制完所有内容后更新屏幕。在您的情况下,请先删除pygame.display.update()
。
答案 1 :(得分:3)
我认为问题的一部分是你正在调用' pygame.display.update()'多一次。在主循环期间尝试只调用一次。
其他一些优化:
loop = True
而不是loop = "yes"
因此...
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
loop = True
# No need to re-make these again each loop.
font1 = pygame.font.SysFont("calibri",40)
font2 = pygame.font.SysFont("calibri",20)
fps = 30
clock = pygame.time.Clock()
while loop:
screen.fill((0, 0, 0), (0, 0, 400, 300))
text = font1.render("TextA", True,(255,255,255))
screen.blit(text,(0,0))
text = font2.render("Begin", True,(255,255,255))
screen.blit(text,(50,50))
pygame.display.update() # Call this only once per loop
clock.tick(fps) # forces the program to run at 30 fps.
答案 2 :(得分:2)
您每0.1秒重新绘制整个屏幕的内容。跟踪实际所做的更改并更新实际包含更改内容的rects更为常见和快捷。因此,在循环之外绘制所有内容,让事件修改屏幕并跟踪实际更改的矩形。
这样的事情:
import pygame, time
pygame.init()
screen = pygame.display.set_mode((400, 300))
screen.fill((0, 0, 0), (0, 0, 400, 300))
font = pygame.font.SysFont("calibri",40)
text = font.render("TextA", True,(255,255,255))
screen.blit(text,(0,0))
font = pygame.font.SysFont("calibri",20)
text = font.render("Begin", True,(255,255,255))
screen.blit(text,(50,50))
loop = "yes"
counter = 0
dirty_rects = []
while loop=="yes":
pygame.display.update()
time.sleep(0.1)
# Handle events, checks for changes, etc. Call appropriate functions like:
counter += 1
if counter == 50:
font = pygame.font.SysFont("calibri",20)
text = font.render("We hit 50!", True,(255,255,255))
screen.blit(text,(50,100))
dirty_rects.append(Rect((50,100),text.get_size()))
答案 3 :(得分:1)
Pygame有一个缓冲系统可以避免闪烁,所以你应该像你一样绘制它们,但最后只更新一次:
...
while loop=="yes":
screen.fill((0, 0, 0), (0, 0, 400, 300))
font = pygame.font.SysFont("calibri",40)
text = font.render("TextA", True,(255,255,255))
screen.blit(text,(0,0))
font = pygame.font.SysFont("calibri",20)
text = font.render("Begin", True,(255,255,255))
screen.blit(text,(50,50))
pygame.display.update() # only one update
time.sleep(0.1)
如果你不想保持帧率,那么Pygame的Clock Class比time.sleep(0.1)好。