首页 > 解决方案 > 我的 pygame 程序闪烁,不完全确定为什么

问题描述

基本上,当我运行此程序时,我想要发生的一切都会发生,除非紫色水滴落下时,它们会闪烁而不是保持实线。我试着弄清楚它并弄乱了pygame.display.update()and thepygame.display.flip()但它要么会一直闪烁,要么紫色的线条就会消失

import random
pygame.init()
window = (640,360)
background = pygame.Surface(window)
screen = pygame.display.set_mode(window)

def main():
    drops = [Drop]*500
    for i in range(len(drops)):
        drops[i] = Drop()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((230,230,250))
        for drop in drops:
            drop.show()
            drop.fall()
        
        pygame.display.update()
    pygame.quit()

def translate(value, leftMin, leftMax, rightMin, rightMax):
    # Figure out how 'wide' each range is
    leftSpan = leftMax - leftMin
    rightSpan = rightMax - rightMin

    # Convert the left range into a 0-1 range (float)
    valueScaled = float(value - leftMin) / float(leftSpan)

    # Convert the 0-1 range into a value in the right range.
    return rightMin + (valueScaled * rightSpan)


class Drop:
    def __init__(self):
        self.x = random.randrange(0,640)
        self.y = random.randrange(-500,-100)
        self.z = random.randrange(0,20)
        self.yspeed = translate(self.z, 0, 20, .2, .3)
        self.len = translate(self.z, 0, 20, 10, 20)

    def fall(self):
        self.y += self.yspeed
        self.yspeed += 0.000001
        if self.y > 360:
            self.y = random.randrange(-200,-100)
            self.yspeed = translate(self.z, 0, 20, .2, .3)
    def show(self):
        pygame.draw.line(screen, (138, 43, 226), (self.x,self.y), (self.x, self.y + self.len), width = random.randrange(1,4))
main()

标签: pythonpygame

解决方案


它闪烁是因为您随机改变每帧每个雨滴的宽度:

pygame.draw.line(screen, (138, 43, 226), (self.x,self.y), 
   (self.x, self.y + self.len), width = random.randrange(1,4)) # <---

添加一个with属性并为每个实例的雨滴设置一个随机值,而不是每帧:

class Drop:
    def __init__(self):
        self.x = random.randrange(0,640)
        self.y = random.randrange(-500,-100)
        self.z = random.randrange(0,20)
        self.yspeed = translate(self.z, 0, 20, .2, .3)
        self.len = translate(self.z, 0, 20, 10, 20)
        self.width = random.randrange(1,4)                         # <---

    def fall(self):
        self.y += self.yspeed
        self.yspeed += 0.000001
        if self.y > 360:
            self.y = random.randrange(-200,-100)
            self.yspeed = translate(self.z, 0, 20, .2, .3)
    def show(self):
        pygame.draw.line(screen, (138, 43, 226), (self.x,self.y),
            (self.x, self.y + self.len), width = self.width)       # <---

推荐阅读