Pygame光标进入指定区域时矩形移动异常:位移30像素后自动回退
核心问题原因
- 两个矩形对象
ex、exz的初始化放在了主循环内部,每一轮循环都会重置为初始坐标,所以移动后下次循环立刻回到初始位置,无法持续移动。 - 矩形绘制、屏幕刷新、填充的代码全部放在主循环外,永远不会被执行,导致画面无正常更新、闪烁。
- 光标位置判断逻辑写在了事件遍历循环内部,仅当有事件触发时才会执行位置校验,且没有做变量初始化防护,可能出现未定义报错;原有碰撞判定逻辑不符合「光标进入任意矩形范围」的需求,pygame内置的
Rect.collidepoint()方法可以直接完成点碰撞检测,不需要手写逻辑。 pygame.quit()执行后没有退出程序,会触发后续代码报错。- 事件类型直接使用魔数可读性极差,建议使用pygame内置常量。
修复后完整代码
import pygame import sys pygame.init() screen = pygame.display.set_mode((700,500)) # 矩形初始化移到循环外,仅初始化一次 ex = pygame.Rect(30,30,60,60) exz = pygame.Rect(0,30,30,60) # 提前初始化光标位置变量 cursor_pos = (0,0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEMOTION: cursor_pos = pygame.mouse.get_pos() # 调试打印可以按需保留 # print(f"{cursor_pos[1]}=y") # print(f"{cursor_pos[0]}=x") # print(f"{exz.x}exz.x, {exz.y}exz.y") # 碰撞判断移到事件循环外,每轮循环都校验 if ex.collidepoint(cursor_pos) or exz.collidepoint(cursor_pos): exz.right += 30 ex.right += 30 # print(f"exz: {exz.x}, {exz.y}") # print(f"exs: {ex.x}, {ex.y}") pygame.display.set_caption("Cursor is in area") else: pygame.display.set_caption("Cursor is not in area") # 绘制逻辑移到循环内,顺序为先填充背景,再画元素,再刷新 screen.fill((50,50,50)) pygame.draw.rect(screen,(255,0,0),ex) pygame.draw.rect(screen,(0,255,0),exz) pygame.display.update()
修复说明
- 矩形初始化移到主循环外,仅执行一次,修改后的坐标可以持续保留
- 绘制逻辑调整到循环内,调整执行顺序为「填充背景→绘制矩形→刷新画面」,避免闪烁
- 碰撞检测改用pygame内置的
collidepoint方法,直接判断光标是否在任意矩形范围内,符合需求 - 新增
sys.exit()在退出pygame后直接终止程序,避免报错 - 替换魔数为pygame内置常量,代码可读性更高
内容的提问来源于stack exchange,提问作者C-Gabibbo
相关产品推荐
相关产品推荐

