我正在尝试使用 Python 3.7.3 中的 Pygame 模块进行球弹跳模拟。我上的课展示了球,但不适用于运动。错误是“赋值前引用了局部变量 x”。我认为这意味着它是本地的但需要是全局的,但是要将球的数量作为变量(所以我可以说要生成多少)我不知道如何解决这个问题。
我试过阅读其他问题,但没有一个能解决我的问题。我能够在边界碰撞工作的情况下让一个球在屏幕上弹跳,但当我让它面向对象时却不行。我也尝试过使用 self 变量来引用每个单独的球,但这没有用。
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 在赋值前被引用。”
请您参考如下方法:
global win,x,y让我们删除未定义的 x`- 此外,
x、y在内部类中使用,而不是全局变量指向各个圆点。
import random
import pygame, sys
import time
from pygame.locals import *
pygame.init()
win_width = 500
win_height = 400
radius = 90
win = pygame.display.set_mode((win_width, win_height), 0, 32)
class BallEntity():
win = None
x = 0
y = 0
dx = 1
dy = 1
radius = 0
# preious position(used for delete previous circle after movement)
prePos = 0, 0
pos = 0, 0
def __init__(self, i, radius):
self.radius = radius
# random position (x, y)
self.x = random.randint(radius, win_width - radius)
self.y = random.randint(radius, win_height - radius)
self.dx = random.randint(-5, 5)
self.dy = random.randint(-5, 5)
def movement(self):
global win
if self.x <= r1 or self.x >= win_width - r1:
self.dx = -self.dx
elif self.x > r1 and self.x < win_width -r1:
self.x += self.dx
if self.y <= r1 or self.y >= win_height - r1:
self.dy = -self.dy
elif self.y > r1 and self.y < win_height -r1:
self.y += self.dy
self.pos = self.x, self.y
# draw background color to delete previous position
pygame.draw.circle(win, (0, 0, 0), self.prePos, self.radius)
# draw circle
pygame.draw.circle(win, (248, 24, 148), self.pos, self.radius)
self.prePos = self.pos
numbBalls = 5
r1 = 8
balls = []
# Create balls and store list
for i in range(numbBalls):
e = BallEntity(i, r1)
balls.append(e)
while True:
# update circle position via movement()
for i in range(numbBalls):
balls[i].movement()
pygame.display.update()
# delay for animation
time.sleep(0.1)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
