2012-01-04 135 views
1

我写了一个小程序来绘制模式一个循环通过不同的颜色以及一个类,以调节帧速率。出于某种原因,每当我运行它时都会随机闪烁,我不知道为什么。这非常简单,所以我怀疑它与屏幕更新足够快有关。我将不胜感激任何建议。pygame闪烁

import pygame, time, random 

w, h = 640, 480 
screen = pygame.display.set_mode((w, h)) 
running = 1 
inc = 20 
m = [1, 1, 1] 
c = [random.randint(0,255), random.randint(0,255), random.randint(0,255)] 


class FrameRate(): 
    def __init__(self, rate = 60): 
     self.frame_rate = rate 
     self.refresh_time = 1.0/self.frame_rate 
     self.cur_time = time.time() 
     self.prev_time = time.time() 
     self.elapsed_time = 0 

    def update(self): 
     temp = self.cur_time 
     self.cur_time = time.time() 
     self.elapsed_time = self.cur_time - self.prev_time 
     self.prev_time = temp 

    def regulate_frame_rate(self): 
     if self.elapsed_time < self.refresh_time: 
      time.sleep(self.refresh_time - self.elapsed_time) 
fr = FrameRate() 
pygame.init() 

while running: 

    fr.update() 
    fr.regulate_frame_rate() 

    event = pygame.event.poll() 
    if event.type == pygame.QUIT: 
      running = 0 

    screen.fill((0, 0, 0)) 

    # Reverse color direction 
    for i, p in enumerate(c): 
     if c[i] > 255 or c[i] < 0: 
      m[i] = -m[i] 
     c[i] += m[i] 

    for i in range(0,w/inc): 
     try: 
      pygame.draw.line(screen, (c[0],c[1],c[2]), (i * inc, 0), (0, h - i*inc)) 
      pygame.draw.line(screen, (c[0],c[1],c[2]), (w - i * inc, 0), (w, h - i*inc)) 
      pygame.draw.line(screen, (c[0],c[1],c[2]), (i * inc, h), (0, i*inc)) 
      pygame.draw.line(screen, (c[0],c[1],c[2]), (w - i * inc, h), (w, i*inc)) 
     except TypeError: 
      pass 

    pygame.display.flip() 

    pygame.quit() 
+0

防止闪烁的最简单方法是删除'screen.fill()'调用(或将其移至循环外部),因为您不需要此应用程序。 – 2012-01-13 15:00:32

+0

我想你应该在'time'上使用'pygame.time.get_ticks()'和'pygame.time.Clock' – ninMonkey 2013-07-10 21:23:41

回答

3

首先,从主循环中获取“pygame.quit()”。

闪烁是由于您的绘图代码周期性崩溃。当try-except块中的除外被击中时,那么没有任何东西会被画出来,并且屏幕会“闪烁”黑色。