Pong in PyGame,移动球拍导致球在击中侧面时停止再生
Pong in PyGame, Moving paddles causes the ball to stop regenerating when hitting the side
所以我正在尝试使用 pygame 创建一个简单的单人 Pong 游戏。球开始,当它撞到墙上时,它会重新生成……只要我不移动球拍。当我移动球拍时,球就会从所有墙壁上弹开,甚至不考虑球拍是否存在。任何解决此问题的代码将不胜感激。谢谢!
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()
好的,所以我对您的代码进行了一些调试,原因似乎是这一行。
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 语句。
我希望这有助于澄清事情。附带说明一下,您在乒乓球比赛中的开局非常好,我建议您在更新球拍运动之前确保球拍在界限内,而不是那项出色的工作!
所以我正在尝试使用 pygame 创建一个简单的单人 Pong 游戏。球开始,当它撞到墙上时,它会重新生成……只要我不移动球拍。当我移动球拍时,球就会从所有墙壁上弹开,甚至不考虑球拍是否存在。任何解决此问题的代码将不胜感激。谢谢!
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()
好的,所以我对您的代码进行了一些调试,原因似乎是这一行。
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 语句。
我希望这有助于澄清事情。附带说明一下,您在乒乓球比赛中的开局非常好,我建议您在更新球拍运动之前确保球拍在界限内,而不是那项出色的工作!