Python Pygame开发Pong游戏时碰撞检测持续误触发问题求解
Pygame Pong游戏碰撞检测持续触发问题修复方案
以下是代码中存在的问题及修复方案:
问题汇总
- Rect坐标未同步更新:你修改球拍、球的位置时,只更新了独立的坐标变量,用于碰撞检测的
rect对象坐标完全没有同步,碰撞检测一直基于初始位置计算,必然出现误触发。 - paddle2碰撞框初始化错误:代码中
paddle2_rect=paddle1.get_rect()错误调用了paddle1的方法,应该使用paddle2自身的get_rect()获取正确的碰撞框尺寸。 - 碰撞判断逻辑错误:你写的
paddle1_rect.right - ball_rect.left <=0判断逻辑仅判断了x轴相对位置,只要球在paddle1右侧就会触发,完全没有校验y轴是否重叠,也没有判断是否真正碰撞。 - 屏幕边界碰撞逻辑错误:
ball_collide_screen中的判断条件完全不符合你设置的500*300的屏幕参数,会导致球的移动逻辑异常。
修复后的完整代码
import pygame pygame.init() pygame.display.set_caption('...SHON...PONG...') icon=pygame.image.load('icon.png') pygame.display.set_icon(icon) FPS=50 fpsClock=pygame.time.Clock() # 注意原变量名写反了,screenh实际是屏幕宽度,screenw实际是屏幕高度 screenh=500 screenw=300 screen=pygame.display.set_mode((screenh,screenw)) black = (0,0,0) paddle1=pygame.image.load('paddle1.png') paddle1_rect=paddle1.get_rect() paddle1_y=100 paddle1_x=10 paddle1_rect.x = paddle1_x paddle1_rect.y = paddle1_y paddle2=pygame.image.load('paddle2.png') # 修复paddle2_rect初始化错误 paddle2_rect=paddle2.get_rect() paddle2_y=100 paddle2_x=471 paddle2_rect.x = paddle2_x paddle2_rect.y = paddle2_y ball=pygame.image.load('player.png') ball_rect=ball.get_rect() ball_x=240 ball_y=130 ball_rect.x = ball_x ball_rect.y = ball_y ball_y_speed=2 ball_x_speed=2 speed=15 def ball_movement(): global ball_x, ball_y, ball_x_speed, ball_y_speed ball_x -= ball_x_speed ball_y += ball_y_speed # 同步更新球的碰撞框坐标 ball_rect.x = ball_x ball_rect.y = ball_y def ball_collide_screen(): global ball_x_speed, ball_y_speed # 修复屏幕边界判断逻辑 if ball_y <= 0 or ball_y + ball_rect.height >= screenw: ball_y_speed = -ball_y_speed # 补充x轴边界碰撞逻辑 if ball_x <=0 or ball_x + ball_rect.width >= screenh: ball_x_speed = -ball_x_speed def ball_collide_paddles(): # 用pygame内置碰撞检测方法,自动判断x、y轴是否重叠 if ball_rect.colliderect(paddle1_rect) or ball_rect.colliderect(paddle2_rect): ball_x_speed = -ball_x_speed print('碰撞触发') running=True while running: screen.fill(black) screen.blit(paddle1, (paddle1_x,paddle1_y)) screen.blit(paddle2, (paddle2_x,paddle2_y)) screen.blit(ball, (ball_x, ball_y)) ball_collide_screen() ball_movement() ball_collide_paddles() pygame.display.update() fpsClock.tick(FPS) for event in pygame.event.get(): if event.type==pygame.QUIT: running=False pygame.quit() if event.type==pygame.KEYDOWN: if event.key==pygame.K_w: paddle1_y-= speed # 同步更新paddle1的碰撞框y坐标 paddle1_rect.y = paddle1_y if event.key==pygame.K_z: paddle1_y+=speed paddle1_rect.y = paddle1_y if event.key==pygame.K_UP: paddle2_y-=speed paddle2_rect.y = paddle2_y if event.key==pygame.K_DOWN: paddle2_y+=speed paddle2_rect.y = paddle2_y
内容的提问来源于stack exchange,提问作者Atwijuka shon
相关产品推荐
相关产品推荐

