def collide(p1, p2):
dx = p1.x - p2.x
dy = p1.y - p2.y
dist = math.hypot(dx, dy)
if dist < p1.size + p2.size:
for i in range (0,1):
neutrList.append(Neutron(xxx,yyy))
for k,neutroon in enumerate(neutrList):
neutroon.verletUpdate(dt)
neutroon.bounce()
neutroon.display()
screen = pygame.display.set_mode((width, height))
screen.fill(background_colour)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(background_colour)
for k, at in enumerate(partList):
neutron.verletUpdate(dt)
neutron.bounce()
collide(at, neutron)
if not len(neutrList):
neutron.display()
at.display()
pygame.display.flip()
pygame.quit()
这是我的计划的一部分。我想绘制绿色圆圈远离蓝色圆圈。蓝色圆圈是静态的,很好。但是,不是绿色圆圈我得到这样的东西 我应该更改什么才能使我的代码正常工作?
中子类
class Neutron():
def __init__(self, x, y):
self.x = x
self.y = y
self.vx = 2.5
self.vy = 0
self.A = 235
self.Z = 92
self.size = 20
self.colour = (0, 255, 0)
self.thickness = 0
def verletUpdate(self,dt):
self.x = self.x + dt * self.vx
self.y = self.y + dt * self.vy
def display(self):
pygame.draw.circle(screen, self.colour, (int(self.x), int(self.y)), self.size, self.thickness)
def bounce(self):
if self.x > width - self.size:
self.x = 2*(width - self.size) - self.x
self.vx = -self.vx
elif self.x < self.size:
self.x = 2*self.size - self.x
self.vx = -self.vx
if self.y > height - self.size:
self.y = 2*(height - self.size) - self.y
self.vy= -self.vy
elif self.y < self.size:
self.y = 2*self.size - self.y
self.vy = -self.vy
答案 0 :(得分:1)
我认为您看到涂片的原因是因为您正在绘制一大堆中子。您正在运行collide()
函数时创建一个新的。见这一行:
neutrList.append(Neutron(xxx,yyy))
你正在为你的清单添加一个新的中子,当你去绘制它们时,你正在绘制它们,每个都有一个稍微不同的位置。您应该通过每帧打印len(neutrlist)
来检查这一点,看看它是否在不断增长。
另外,为什么你的collide()
功能绘制和创建中子?它应该根据碰撞调整位置/速度吗?使用碰撞检查功能绘制并创建碰撞的对象不是一个好的设计选择。中子绘图和创建应该在程序的其他地方进行。