Pygame Zero碰撞检测失效求助:点击鼠标误判得分
解决小球不在目标线点击仍得分的问题
你的问题出在碰撞检测逻辑上:当前用ball.colliderect(target)检测的是两个矩形区域的重叠,但如果你的linetarget是一条细线条,它的矩形碰撞范围会比视觉上的线条大很多——只要小球的矩形和目标的矩形有一点点重叠,就会判定得分,哪怕视觉上小球没在线条上。
Pygame Zero 修正方案
修改on_mouse_down函数,用坐标范围检测代替矩形碰撞,确保只有小球落在线条的实际范围内才判定得分:
import pgzrun import pygame import sys WIDTH = 800 HEIGHT = 800 score = 0 lives = 3 ball = Actor("redball") ball.pos = 100,700 target = Actor("linetarget") target.pos = 400,680 def draw(): screen.clear() ball.draw() target.draw() def update(): ball.x += 10 if ball.x == 800: ball.x = 100 def on_mouse_down(): global score global lives # 调整上下偏移量(这里的5)匹配你的linetarget图片的实际粗细 line_y_min = target.y - 5 line_y_max = target.y + 5 # 检测小球y坐标在线条范围内,且x坐标覆盖线条的水平范围 if line_y_min <= ball.y <= line_y_max and target.left <= ball.x <= target.right: score += 1 print(score) else: lives -= 1 if lives == 0: sys.exit() pgzrun.go()
纯 Pygame 解决方案
如果换成纯Pygame,逻辑类似,用小球中心坐标检测是否落在目标线条的范围内:
import pygame import sys pygame.init() WIDTH = 800 HEIGHT = 800 screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() score = 0 lives = 3 # 替换成你自己的图片路径 ball_img = pygame.image.load("redball.png").convert_alpha() ball_rect = ball_img.get_rect(topleft=(100, 700)) target_img = pygame.image.load("linetarget.png").convert_alpha() target_rect = target_img.get_rect(center=(400, 680)) running = True while running: screen.fill((0, 0, 0)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.MOUSEBUTTONDOWN: # 用小球中心坐标检测,更贴合视觉判定 ball_center_x, ball_center_y = ball_rect.center if (target_rect.top <= ball_center_y <= target_rect.bottom) and (target_rect.left <= ball_center_x <= target_rect.right): score += 1 print(f"当前得分: {score}") else: lives -= 1 if lives == 0: print("游戏结束") running = False # 更新小球位置 ball_rect.x += 10 if ball_rect.x >= WIDTH: ball_rect.x = 0 # 绘制元素 screen.blit(ball_img, ball_rect) screen.blit(target_img, target_rect) pygame.display.flip() clock.tick(30) pygame.quit() sys.exit()
说明:
- 如果你是垂直线条,把检测逻辑换成x坐标的范围,y坐标覆盖线条的垂直范围即可。
- 偏移量(比如Pygame Zero里的5)需要根据你的
linetarget图片的实际粗细调整,确保判定精准。
内容的提问来源于stack exchange,提问作者dgf fdg
相关产品推荐
相关产品推荐

