如何解决在Pygame中的点之间画一条线
所以我试图制作类似于烟花的东西。我做了一个粒子课,它将组成烟火。
class Particle:
def __init__(self,pos,angle):
self.pos = pos
self.angle = angle
self.color = choice([(217,103,51),(238,95,30)])
self.radius = uniform(2,7)
self.pull = 0
self.start = time.time()
def adjust(self):
self.radius -= 0.03
def draw(self):
if self.radius > 0:
pygame.draw.circle(D,self.color,(int(self.pos[0]),int(self.pos[1])),int(self.radius))
def move(self):
now = time.time()
self.pos[0] += cos(radians(self.angle)) * 2
self.pos[1] += (sin(radians(self.angle)) + self.pull) * 2
if now - self.start > 0.1:
self.pull += 0.25
self.start = now
然后我制作了一个Fireworks类,可以拍摄从0到360度的粒子。
class FireWorks:
def __init__(self):
self.particles = []
for i in range(360):
self.particles.append(Particle([600,300],i))
def explode(self):
for i in range(len(self.particles)):
self.particles[i].draw()
self.particles[i].move()
self.particles[i].adjust()
for p in self.particles:
if p.radius < 0:
self.particles.remove(p)
现在,我要沿着粒子产生的路径从它们产生的位置(600、300)画一条线。但问题是粒子不会直线移动。为了使它看起来更自然,我对y值做了此操作:self.pos[1] += (sin(radians(self.angle)) + self.pull) * 2
。 self.pull
的值每0.1秒增加0.25。我尝试做的一件事是,每当y增大时存储位置值,并在这些位置之间绘制线以形成曲线,但什么也没画,这会导致滞后。这是只显示生成点和在点之间画线的位的代码。
class Particle:
def __init__(self,angle):
self.points = [] #added list to init to hold the points between which lines need to be drawn
def move(self):
# In move method,every time a value is added to y,we record position at that point
if now - self.start > 0.1:
self.points.append(self.pos)
self.pull += 0.25
def draw(self):
# Iterate through the points in the list and draw a line between them
for i in range(len(self.points)):
for j in range(1,len(self.points)):
pygame.draw.line(D,(int(self.points[i][0]),int(self.points[i][1])),(int(self.points[j][0]),int(self.points[j][1])),int(self.radius))
这里是完整的代码供参考。
import pygame
from math import radians,sin,cos
from random import choice,uniform,randint
import time
pygame.init()
WIN = pygame.display
D = WIN.set_mode((1200,600))
class Particle:
def __init__(self,angle):
self.pos = pos
self.angle = angle
self.color = choice([(217,30)])
self.radius = uniform(2,7)
self.pull = 0
self.start = time.time()
self.points = []
def adjust(self):
self.radius -= 0.03
def draw(self):
if self.radius > 0:
pygame.draw.circle(D,int(self.radius))
for i in range(len(self.points)):
for j in range(1,len(self.points)):
pygame.draw.line(D,int(self.radius))
def move(self):
now = time.time()
self.pos[0] += cos(radians(self.angle)) * 2
self.pos[1] += (sin(radians(self.angle)) + self.pull) * 2
if now - self.start > 0.1:
self.points.append(self.pos)
self.pull += 0.25
self.start = now
class FireWorks:
def __init__(self):
self.particles = []
for i in range(360):
self.particles.append(Particle([600,i))
def explode(self):
for i in range(len(self.particles)):
self.particles[i].draw()
self.particles[i].move()
self.particles[i].adjust()
for p in self.particles:
if p.radius < 0:
self.particles.remove(p)
f = FireWorks()
D.fill((0,0))
while True:
pygame.event.get()
D.fill((0,0))
f.explode()
WIN.flip()
解决方法
您必须在位置列表中追加位置元组的副本,而不是位置的引用:
self.points.append(self.pos)
self.points.append(self.pos[:])
请注意,self.pos
是指具有2个组成部分的元组。因此,self.points.append(self.pos)
将对此位置的新引用附加到列表中,但不会生成新位置。
为提高性能,我建议在列表中添加积分位置,并通过pygame.draw.lines()
沿粒子的路径绘制直线:
class Particle:
# [...]
def draw(self):
if self.radius > 0:
pygame.draw.circle(D,self.color,(int(self.pos[0]),int(self.pos[1])),int(self.radius))
if len(self.points) > 1:
pygame.draw.lines(D,False,self.points)
def move(self):
now = time.time()
self.pos[0] += cos(radians(self.angle)) * 2
self.pos[1] += (sin(radians(self.angle)) + self.pull) * 2
if now - self.start > 0.1:
x,y = round(self.pos[0]),round(self.pos[1])
self.points.append((x,y))
self.pull += 0.25
self.start = now
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。