我正在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()。
有谁知道我做错了什么,然后不小心修好了?
答案 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方法之前的所有声明。