Pong в PyGame, движущиеся весла заставляют мяч перестать восстанавливаться при ударе в сторону

Итак, я пытаюсь создать простую однопользовательскую игру Pong с pygame. Мяч запускается, и когда он ударяется о стену, он восстанавливается ... до тех пор, пока я не буду двигать ракеткой. Когда я двигаю ракеткой, мяч просто отскакивает от всех стен и даже не принимает во внимание, есть ракетка или нет. был бы очень признателен за любой код для исправления этого. Спасибо!

import sys
import pygame
pygame.init()

size = width, height = 1000, 800
screenColor = 0, 0, 0
outline = 0, 0, 255

paddleOne = pygame.image.load("PONGPADDLE.png")
ball = pygame.image.load("Bullet.png")
ballRect = ball.get_rect()
speed = [1, 1]
paddleOne_x = 980
paddleOne_y = 400

paddleOnePos_x = 0
paddleOnePos_y = 0

screen = pygame.display.set_mode(size)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                paddleOnePos_y = -1
            if event.key == pygame.K_DOWN:
                paddleOnePos_y = +1

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                paddleOnePos_y = 0
            if event.key == pygame.K_DOWN:
                paddleOnePos_y = 0

    ballRect = ballRect.move(speed)

    if ballRect.left < 0:
        speed[0] = -speed[0]
    if ballRect.top < 0 or ballRect.bottom > height:
        speed[1] = -speed[1]
    if ballRect.right == 980:
        if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:
            speed[0] = -speed[0]
        else:
            ballRect = ball.get_rect()

    paddleOne_y += paddleOnePos_y

    screen.fill(screenColor)
    screen.blit(paddleOne, (paddleOne_x, paddleOne_y))
    screen.blit(ball, ballRect)
    pygame.draw.rect(screen, outline, ((0, 0), (width, height)), 5)
    pygame.display.flip()

person Slim    schedule 03.05.2015    source источник


Ответы (1)


Хорошо, я немного отладил ваш код, и причина, похоже, в этой строке.

if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:

Я скопирую и вставлю некоторые отладки, которые я сделал, чтобы помочь объяснить. Я вставил эти строки в ваш код.

if ballRect.right == 980:
    print('ballRect.right > paddleOne_y ' + str(ballRect.right) + '>' + str(paddleOne_y) + str(paddleOne_y & ballRect.right > paddleOne_y))
    print('ballRect.right < paddleOne_y ' + str(ballRect.right) + '<' + str(paddleOne_y) + str(paddleOne_y & ballRect.right < paddleOne_y))
    print(str(paddleOne_y & ballRect.right) + ' paddleOne_y & ballRect.right')
    print('ballRect.right > paddleOne_y & ballRect.right < paddleOne_y')
    print(str(ballRect.right) + '>' + str(paddleOne_y & ballRect.right) + '<' + str(paddleOne_y))
    print()
    if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y:
        speed[0] = -speed[0]
    else:
        ballRect = ball.get_rect()

Следующий код - это то, что происходит, когда вы НЕ перемещаете ракетку.

ballRect.right > paddleOne_y 980>400 False
ballRect.right < paddleOne_y 980<400 False
400 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 400 < 400

Строка if ballRect.right > paddleOne_y & ballRect.right < paddleOne_y: сначала оценивает paddleOne_y & ballRect.right, и если вы не двигаете весло, paddleOne_y = 400 не спрашивайте меня, почему, может быть, кто-то другой может помочь, но paddleOne_y & ballRect.right, если вы не двигаете весло, оценивается как 980 и 400, что, я полагаю, оценивается как 400. Таким образом, причина, по которой он никогда не входит в цикл for и отскакивает, заключается в том, что ballRect.right > paddleOne_y & ballRect.right < paddleOne_y оценивается как 980 > 400 < 400, а 400 не меньше 400. С другой стороны, когда вы перемещаете ракетку, например, вы получаете такие числа, как.

ballRect.right > paddleOne_y 980>231 False
ballRect.right < paddleOne_y 980<231 True
196 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 196 < 231

Если сдвинуть весло вниз, получится.

ballRect.right > paddleOne_y 980>710 False
ballRect.right < paddleOne_y 980<710 True
708 paddleOne_y & ballRect.right
ballRect.right > paddleOne_y & ballRect.right < paddleOne_y
980 > 708 < 710

Пока ракетка отображается на экране, среднее число всегда находится между двумя другими числами и, следовательно, всегда удовлетворяет оператору if.

Я надеюсь, что это поможет прояснить ситуацию. В качестве побочного примечания, у вас очень хорошее начало игры в понг, я рекомендую убедиться, что весло находится в пределах, прежде чем вы обновите свои движения весла, кроме этой отличной работы!

person Austin V    schedule 03.05.2015