Проблема в том, как проверить, что мяч покинул экран. Ваше текущее условие проверки никогда не сработает, так как pong_ball.rect.left
никогда не будет равно WIDTH - 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
Когда мяч движется к правой стороне экрана и его позиция затем сбрасывается.
Таким образом, вы видите, что позиция шара движется мимо ваш лимит без активации вашего условия.
Если вы измените сравнение на >
и <
соответственно, оценка обновится.
Однако это вызовет другую проблему, которая также может быть очевидно из отладочных отпечатков выше. Есть четыре кадра, где условие оценки истинно, потому что проверка позиции сброса в PongBall.update()
не имеет 12,5-пиксельной задержки. Это почему свобода существует в первую очередь? Ваша будущая личность может быть благодарна за комментарий.
Но если вы измените сравнение, чтобы удалить буфер размером 12,5 пикселей, оценка не обновится. Это связано с тем, что позиция pong_ball
обновляется и сбрасывается в методе update()
.
Если мы следуем вашему подходу для отскока, мы можем добавить отдельный метод reset
к PongBall
и назовите это, когда мы соответствуем критериям для оценки.
Итак, ваш класс 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
Ваш основной l oop меняется и выполняет сброс:
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
....
Тогда ваш счет должен вести себя правильно.