如何在PyGame中让触碰到边界的小球(LOPTICA)重置至默认位置?
Ping Pong游戏小球重置问题解决办法
你需要在小球(LOPTICA)超出左右屏幕边界的判断块中,添加重置小球位置、速度以及球拍位置的逻辑,具体修改如下:
修改关键代码段
原代码中的判断部分:
LOPTICA = LOPTICA.move(BRZINA_LOPTICE) if LOPTICA.left < 0 or LOPTICA.right > width: ##what i should put here ?
替换为:
LOPTICA = LOPTICA.move(BRZINA_LOPTICE) if LOPTICA.left < 0 or LOPTICA.right > width: # 重置小球到屏幕中心 LOPTICA.center = (width//2, height//2) # 重置小球速度(x方向反向,y方向回到初始值) BRZINA_LOPTICE[0] = -BRZINA_LOPTICE[0] BRZINA_LOPTICE[1] = 4.5 # 重置左右球拍回到初始位置(可选,按需保留) LEVALINIJA.y = 220 DESNALINIJA.y = 220
完整修改后的代码
import pygame import os width, height = 900, 500 screen = pygame.display.set_mode((width, height)) FPS = 60 BRZINA = 6 BRZINA_LOPTICE = [4.5, 4.5] ikonica = pygame.image.load(os.path.join('dodaci', "ikonica.png")) pygame.display.set_caption('Ping Pong') pygame.display.set_icon(ikonica) pozadina = pygame.image.load(os.path.join('dodaci', 'pozadina.jpg')) BOJALINIJE = (255, 255, 255) BOJALOPTICE = (224, 15, 0) LEVALINIJA = pygame.Rect(100, 220, 7, 100) DESNALINIJA= pygame.Rect(800, 220, 7, 100) radius= 10 LOPTICA = pygame.Rect(width//2, height//2, radius*2, radius) def prikaz_pozadine(): screen.blit(pozadina, (0, 0)) pygame.draw.rect(screen, BOJALINIJE, LEVALINIJA) pygame.draw.rect(screen, BOJALINIJE, DESNALINIJA) pygame.draw.circle(screen, BOJALOPTICE, LOPTICA.center, radius) pygame.display.update() def kretanje_linija(LEVALINIJA, DESNALINIJA): tasteri_kretanja = pygame.key.get_pressed() if tasteri_kretanja[pygame.K_w] and LEVALINIJA.y - BRZINA > 0: LEVALINIJA.y -= BRZINA if tasteri_kretanja[pygame.K_s] and LEVALINIJA.y + BRZINA + LEVALINIJA.height < height: LEVALINIJA.y += BRZINA if tasteri_kretanja[pygame.K_UP] and DESNALINIJA.y - BRZINA > 0: DESNALINIJA.y -= BRZINA if tasteri_kretanja[pygame.K_DOWN] and DESNALINIJA.y + BRZINA + LEVALINIJA.height < height: DESNALINIJA.y += BRZINA def glavnica(): clock = pygame.time.Clock() running = True while running: global LOPTICA clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False LOPTICA = LOPTICA.move(BRZINA_LOPTICE) if LOPTICA.left < 0 or LOPTICA.right > width: # 重置小球到屏幕中心 LOPTICA.center = (width//2, height//2) # 重置小球速度方向 BRZINA_LOPTICE[0] = -BRZINA_LOPTICE[0] BRZINA_LOPTICE[1] = 4.5 # 重置球拍位置 LEVALINIJA.y = 220 DESNALINIJA.y = 220 if LOPTICA.top < 0 or LOPTICA.bottom > height: BRZINA_LOPTICE[1] = -BRZINA_LOPTICE[1] if LOPTICA.colliderect(LEVALINIJA): BRZINA_LOPTICE[0] = abs(BRZINA_LOPTICE[0]) if LOPTICA.colliderect(DESNALINIJA): BRZINA_LOPTICE[0] = -abs(BRZINA_LOPTICE[0]) prikaz_pozadine() kretanje_linija(LEVALINIJA, DESNALINIJA) if __name__ == "__main__": glavnica()
说明
- 用
LOPTICA.center = (width//2, height//2)直接定位小球到中心,比重新创建Rect对象更稳妥,避免引用问题。 - 重置速度时让x方向反向,保证下一次发球朝向得分对侧;y方向回到初始值,也可改成随机方向增加游戏性。
- 球拍重置是可选操作,不需要的话可以删除对应两行代码。
内容的提问来源于stack exchange,提问作者GigaBurek
相关产品推荐
相关产品推荐

