1 回答

TA贡献2011条经验 获得超2个赞
问题是你如何检查球是否离开了屏幕。您当前的检查条件永远不会触发,因为它永远不会等于,因为它是一个整数。pong_ball.rect.leftWIDTH - 12.5
一个简单的调试方法只需打印要检查的值,因此
print(pong_ball.rect.left, WIDTH - 12.5)
将输出:
1264 1267.5
1267 1267.5
1270 1267.5
1273 1267.5
1276 1267.5
1279 1267.5
625 1267.5
628 1267.5
当球向屏幕右侧移动时,其位置将被重置。
因此,您会看到球的位置超过您的极限,而不会触发您的条件。
如果将比较分别更改为 和,则分数将更新。><
但是,这将导致另一个问题,从上面的调试打印中也可以明显看出。有四帧的评分条件为真,因为重置位置检入没有 12.5 像素的回旋余地。这就是当初存在回旋余地的原因吗?你未来的自己可能会喜欢评论。PongBall.update()
但是,如果您更改比较以删除 12.5 像素缓冲区,则分数不会更新。这是因为位置在其方法中更新和重置。pong_ballupdate()
如果我们遵循您的弹跳方法,我们可以添加一个单独的方法,并在满足评分标准时调用该方法。resetPongBall
所以你的类现在是:PongBall
class PongBall(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((30, 30))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.speedx = random.choice(pong_ball_x)
self.speedy = random.choice(pong_ball_y)
self.reset()
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top <= 0:
self.speedy = -self.speedy
if self.rect.bottom >= HEIGHT:
self.speedy = -self.speedy
def reset(self):
self.rect.x = WIDTH / 2 - 15
self.rect.y = HEIGHT / 2 - 15
def bounce(self):
self.speedx = -self.speedx
您的主循环将更改为同时执行重置:
while running:
# process input (events)
for event in pg.event.get():
# check for closing window
if event.type == pg.QUIT:
running = False
# check for score
if pong_ball.rect.left > WIDTH - 12.5:
score = score + 1
pong_ball.reset()
if pong_ball.rect.right < 12.5:
score2 = score2 + 1
pong_ball.reset()
# update
....
那么你的分数应该表现正确。
添加回答
举报