回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我制作了一个名为“粒子”的类,这些粒子基本上只是矩形,当它们太小时会收缩、移动并被破坏</p>
<p>我的<strong>init</strong>方法有5个可选参数,如果没有,将被分配一个随机值</p>
<p>粒子是使用pygame.draw.rect绘制的
当“size”和“sizeDecay”参数是随机的时,粒子在移动时闪烁,我不知道为什么,因为字面上唯一的区别是有随机的起始值(减少是线性的)</p>
<p>以下是我认为可能相关的代码:
初始方法</p>
<pre><code> RSizeR = [50, 100] # short for RandomSizeRange
RSizeDecayR = [10, 30] # short for RandomSizeDecayRange (NOTE : this value is divided by 10)
RSpeedR = [15, 50] # short for RandomSpeedRange (NOTE : this value is divided by 10)
# shape = "s" for square or "c" for circle
def __init__(self, startpos, shape, colour = None, size = None, sizeDecay = None, angle = None, speed = None):
self.pos = [int(startpos[0]), int(startpos[1])]
self.shape = shape
if colour == None: self.colour = tuple(random.randint(0, 255) for i in range(3))
else: self.colour = colour
if size == None: self.size = random.randint(Particle.RSizeR[0], Particle.RSizeR[1])
else: self.size = size
if sizeDecay == None: self.sizeDecay = random.randint(Particle.RSizeDecayR[0], Particle.RSizeDecayR[1])
else: self.sizeDecay = sizeDecay
if angle == None: self.angle = random.randint(0, 360)
else: self.angle = angle
if speed == None: self.speed = random.randint(Particle.RSpeedR[0], Particle.RSpeedR[1])
else: self.speed = speed
self.xspeed = sin(self.angle) * self.speed
self.yspeed = cos(self.angle) * self.speed
self.rect = pygame.Rect(self.pos[0], self.pos[1], self.size, self.size)
</code></pre>
<p>update方法(返回的True告诉程序删除该粒子)</p>
<pre><code> def update(self):
self.pos[0] += self.xspeed / 10
self.pos[1] += self.yspeed / 10
self.size -= self.sizeDecay / 10
if self.size <= 0:
return True
self.rect.width = int(self.size)
self.rect.height = int(self.size)
self.rect.center = (int(self.pos[0]), int(self.pos[1]))
return False
</code></pre>
<p>画法</p>
<pre><code> def draw(self):
if self.shape == "s":
pygame.draw.rect(screen, self.colour, self.rect)
elif self.shape == "c":
pygame.draw.circle(screen, self.colour, self.rect.center, int(self.size/2))
</code></pre>
<p>我曾尝试在类之外定义随机值并将其传递给init方法,但问题仍然存在</p>
<p>我最好的猜测是,计算两个额外的随机数不知何故会减慢程序的速度</p>
<p><strong>更新</strong></p>
<p>我用来更新屏幕的代码在while循环中,如下所示</p>
<pre><code>gameState = "running"
while gameState != "exit":
# catching events here
# rest of code here
pygame.display.flip()
clock.tick(fps)
</code></pre>
<p>我这样定义我的窗口:</p>
<pre><code>pygame.init()
clock = pygame.time.Clock()
fps = 60
SCREENSIZE = SCREENX, SCREENY = 800, 800
screen = pygame.display.set_mode(SCREENSIZE)
</code></pre>
<p>此外,这是我用来更新粒子并将其绘制到屏幕上的代码(它位于粒子类内部)</p>
<pre><code> @classmethod
def UpAndDrawAll(cls):
for index, par in enumerate(cls.Particles):
delete = par.update()
if delete:
del cls.Particles[index]
else:
par.draw()
</code></pre>
<p><strong>更新2</strong></p>
<p>我注意到随机速度也有很小的性能下降,问题是由使用随机生成的值引起的,而不是由生成随机数引起的(仍然没有解决问题)</p>
<p>我还注意到,有些粒子比其他粒子闪烁得更频繁,有些甚至不闪烁</p>