尽管有明确的颜色参数,但游戏循环的一次迭代中的所有矩形都绘制相同的颜色

时间:2012-09-21 19:16:05

标签: python sdl pygame

我正在Pygame写一个简单的玩具。当您按下主行上的某个键时,它会产生一点颗粒。

class Particle():
    x = 0
    y = 0
    size = 0
    colour = (255, 255, 255)
    rect = None
    def __init__(self, x, y, size, colour):
        self.x = x
        self.y = y
        self.size = size
        self.colour = colour # Particle has its own colour 
        self.rect = pygame.Rect(self.x, self.y, self.size, self.size)

class Burst():
    x = 0
    y = 0
    colour = (255, 255, 255)
    count = 0
    sound = None
    particles = []

    def __init__(self, x, y, colour, count, sound):
        self.x = x
        self.y = y
        self.colour = colour # Burst has its own colour, too - all its particles should have the same colour as it
        self.count = count
        self.sound = sound
        self.particles.append(Particle(self.x, self.y, 5, self.colour))

    def update(self):
        self.particles.append(Particle(random.randint(1, 30) + self.x, random.randint(1, 30) + self.y, 5, self.colour))
    def draw(self):
        global screen
        for p in self.particles:
            pygame.draw.rect(screen, p.colour, p.rect) # This draws the particles with the correct colours
            #pygame.draw.rect(screen, self.colour, (60, 60, 120, 120), 4) # This draws the particles all the same colour
            #screen.fill(p.colour, p.rect) # This draws the particles all the same colour

您正在寻找的行是Burst.draw。出于某种原因,只有未注释的一个正常工作。另外两条线,就我所知,应该是相同的,只能正确地绘制第一个爆发的粒子。任何后续突发都会更改屏幕上的所有粒子以匹配其颜色。

我可以提供更多代码,但它没有更多。基本上,按键将Bursts添加到一个数组中,每一个tick我都会逐步调用该数组调用update()和draw()。

有谁知道我做错了什么,然后不小心修好了?

1 个答案:

答案 0 :(得分:3)

因为屏幕中的所有粒子都属于同一个集合Burst.particles。 每次处理Burst时,您都会处理全部粒子,并且所有粒子都会被涂上最后一种颜色。

只需将初始化particles = []移至init方法。

def __init__(self, x, y, colour, count, sound):
    ...
    self.particles = []
    self.particles.append(Particle(self.x, self.y, 5, self.colour))

<强>更新

您正在使用Java / C#样式的编码类。您不应该在类级别进行任何初始化,除非它们是常量或类属性。

IE:

class Burst():

    class_attribute = 0       # declaration of class (static) attribute

    def __init__(self, ...):
        self.attribute = 0    # declaration of object (regular) attribute

您不应该使用属性的类声明来使用对象属性。 只需删除两个类中init方法之前的所有声明。