如何正确更新使用 pygame 单独绘制的 100 个类对象的位置和速度?

2024-03-06

我正在看这个视频https://www.youtube.com/watch?v=mhjuuHl6qHM https://www.youtube.com/watch?v=mhjuuHl6qHM通过 The Coding Train,我想:“如果我用 Python 制作它会怎么样?”我决定使用 pygame 来制作图形,因为我不擅长编码,而且也很新,所以这就是我所知道的全部。我开始着手去做。但我很快发现这对我来说是不可能的。我仍然想做视频的一部分作为挑战。他创建了一堆圆圈,给它们一个随机的速度,并让它们从屏幕中心离开。所以我创建了 100 个具有随机速度矢量的“物体”,并将它们的位置、速度和加速度放入一个列表中。它会打开一个 pygame 窗口并创建 boids,甚至更新它们的位置。不幸的是,它们的位置没有正确更新,它们变成了一团在屏幕外沿单一方向行走的圆圈。有人能帮我解决这个问题吗?

import pygame
import pygame.locals
import numpy

pygame.init()
screen = (1600, 1200)
display = pygame.display.set_mode(screen)
clock = pygame.time.Clock()
boids = []
j = 0

class Boid:
    position = numpy.array([screen[0] / 2, screen[1] / 2])
    velocity = numpy.array([0, 0])
    acceleration = numpy.array([0, 0])

    def update(self):
        self.position += self.velocity
        self.velocity += self.acceleration

for i in range(100):
    i = Boid()
    i.velocity = (numpy.random.choice([-5, -4, -3. -2. -1, 1, 2, 3, 4, 5]) * (numpy.random.random(2,)) + numpy.array([0.5, 0.5]))
    boids.append(i)
    #print(numpy.random.choice([-5, -4, -3. -2. -1, 1, 2, 3, 4, 5]))
    print(i.position, i.velocity, i.acceleration)

while True:
    j += 1
    display.fill((0, 0, 0))
    for n in range(len(boids)):
        pygame.draw.circle(display, (255 - n, 255 - n, 255 - n), (int(boids[n].position[0]), int(boids[n].position[1])), 20)
        Boid.update(boids[n])
        print(n, boids[n].position, boids[n].velocity, boids[n].acceleration)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    i.update()
    clock.tick(30)
    pygame.display.update()
    if j == 5:
        pygame.quit()
        exit()

position, velocity, acceleration are 类属性 https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables。向类添加构造函数Boid并创造实例属性 https://docs.python.org/3/tutorial/classes.html#instance-objects:

class Boid:
    def __init__(self):
        self.position = numpy.array([screen[0] / 2, screen[1] / 2])
        self.velocity = numpy.array([0, 0])
        self.acceleration = numpy.array([0, 0])

    def update(self):
        self.position += self.velocity
        self.velocity += self.acceleration

类属性由类的所有实例共享。但实例属性对于每个实例来说都是唯一的。在你的里面实际上只有一个position由所有实例共享Boid.


对于 x 和 y 分量的随机且不同的分布,您可以使用numpy.random.random_sample https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.random_sample.html:

i.velocity = 5 * (numpy.random.random_sample((2)) - numpy.array([0.5, 0.5]))

或者甚至是随机的解决方案unit https://en.wikipedia.org/wiki/Unit_vector圆形分布的方向向量:

vec =  numpy.random.random_sample(2) - numpy.array([0.5, 0.5])
i.velocity = 5 * numpy.random.random(1) * vec / numpy.linalg.norm(vec)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确更新使用 pygame 单独绘制的 100 个类对象的位置和速度? 的相关文章

随机推荐