对于我的《 Dofe Gold》,我在pygame中创建了一个pong游戏,因为这是我第一次使用pygame,所以我没有使用精灵,因为我没有发生这种情况。我现在想要一个解决方案,该解决方案可以使我解决问题而无需完全用sprite重写代码。注意:我希望这仍然是我的代码,所以我不会接受别人改写的解决方案,因为这会带走任何成就感。提前谢谢了。 我的代码:
import pygame
import random
global vel
run = True
def pong():
global run
collision = 0
pygame.init()
screen = (600, 600)
window = pygame.display.set_mode((screen))
pygame.display.set_caption("Pong")
x = 300
y = 590
coords = (300, 150)
width = 175
height = 10
vel = 10 - selection
velx = 10
vely = 10
while run == True:
pygame.time.delay(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and x>0:
x -= vel
elif keys[pygame.K_RIGHT] and x<600-width:
x += vel
if event.type == pygame.MOUSEBUTTONUP:
pygame.quit()
quit()
paddlecoords = (x, y, width, height)
window.fill((255, 255, 255))
ball = pygame.draw.circle(window, (255,0,255), coords,(35), (0))
paddle = pygame.draw.rect(window, (0, 0, 0), paddlecoords)
pygame.display.update()
coords=((int(coords[0])+velx), (int(coords[1])+vely))
if coords[0]>600-35:
velx = -velx
elif coords[0]<35:
velx = -velx
elif coords[1]<35:
vely = -vely
elif coords[1]>600-35:
vely = -vely
selection =input("Do you want to play\n1)easy\n2)medium\n3)hard\n4)impossible?\n")
if selection.isdigit():
if 0 < int(selection) < 5:
selection = int(selection)
selection = (selection-1)*2
else:
print("must be between 1 and 4")
else:
print("number must be an integer")
quit()
pong()
答案 0 :(得分:0)
由于您不需要任何代码,因此请用文字进行操作。
写一个名为ballHits()
的函数。
将函数paddlecoords
,球coords
和球的半径35
传递给函数吗?为radius
在此新函数中,paddlecoords
定义了一个矩形。代码需要检查Ball的边缘是否在此矩形内。
一种简单的实现方法是计算围绕球的矩形(正方形)的坐标。由于球是从中心画的,因此大约可以做到:
[ coords.x - radius, coords.y - radius, 2 * radius, 2 * radius ]
# the [ x, y, width, height] of a square covering a circle
使用PyGame的rect
类,确定两个矩形是否重叠。
一种非简单的实现方式是,预先生成用于形成球的圆的边缘像素列表。也许使用Mid-Point Circle Algorithm之类的东西,以(0,0)
为中心,为您提供可以用当前Ball坐标调整的点的列表。
使用桨板矩形,PyGame的rect
类确定当偏移到当前球位置时,那些点中的任何一个是否与桨板发生碰撞。这将为您提供真正的碰撞,而不是近似值,并且对角到角的碰撞效果更好。首先使用上面的平方方法检查粗略的碰撞,然后检查许多圆点,可能会更快。
如果代码确定存在冲突,请从函数返回True
,否则返回False
。
在您的主代码中,调出该函数,并对返回的结果进行操作。