【发布时间】:2019-04-20 13:51:43
【问题描述】:
我正在尝试使用 Python 3.7.3 中的 Pygame 模块进行球反弹模拟。我的课程展示了球,但不适用于运动。错误是“分配前引用的局部变量 x”。我认为这意味着它是本地的,但需要是全局的,但是要将球的数量作为变量(所以我可以说要生成多少)我不知道如何解决这个问题。
我尝试阅读其他问题,但没有一个能够解决我的问题。我可以让一个球在屏幕上弹跳,边界碰撞工作,但当我使它面向对象时却不行。我也尝试过使用自变量来引用每个单独的球,但这没有用。
class BallEntity():
def __init__(self, radius):
x = random.randint(radius, win_width - radius)
y = random.randint(radius, win_height - radius)
pos = x, y
pygame.draw.circle(win, (248, 24, 148), pos, radius)
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
BallEntity.movement(self)
def movement(self):
if x <= r1 or x >= win_width - r1:
dx = -dx
elif x > r1 and x < win_width -r1:
x += dx
if y <= r1 or y >= win_height - r1:
dy = -dy
elif self.y > r1 and self.y < win_height -r1:
y += dy
numbBalls = 8
r1 = 8
for i in range(numbBalls):
BallEntity.__init__(i, r1)
我希望球在碰撞工作的情况下打印和移动,但我收到错误“在赋值之前引用了局部变量 x。”
【问题讨论】:
-
总是将完整的错误消息(Traceback)放在有问题的地方(作为文本,而不是屏幕截图)。还有其他有用的信息。
-
你可以用
BallEntity.movement(self)代替self.movement(),这是首选方法。 -
您的变量是本地变量 - 您必须使用
self.才能访问类中所有方法中的变量 -self.x、self.y、self.dx、self.dy、 -
不是
BallEntity.__init__(i, r1),而是BallEntity(r1)