Pygame自定义光标绘制异常:鼠标移出窗口右下区域时未停止渲染
解决Pygame自定义光标移出窗口右侧/底部时残留的问题
问题根源
你用坐标范围判断鼠标是否在窗口内的逻辑有缺陷:当鼠标从窗口右侧或底部移出时,Pygame的pg.mouse.get_pos()会返回窗口边缘的最大有效坐标(比如x=MAX_X-1、y=MAX_Y-1),这时候你的条件x < MAX_X和y < MAX_Y仍然成立,导致光标继续被绘制,停留在窗口边缘。而从左侧或上部移出时,坐标会变成负数,条件不满足,光标才会消失。
最优解决方案
改用Pygame内置的pg.mouse.get_focused()函数,它能直接检测鼠标是否处于窗口内(窗口激活且鼠标在区域内),返回布尔值,完全避免坐标判断的误差。
修改后的代码
循环前初始化代码
import pygame as pg pg.init() screen = pg.display.set_mode((1316, 740)) MAX_X, MAX_Y = screen.get_size() # 加载自定义光标(替换为你的文件路径) cursor = pg.image.load("custom_cursor.png").convert_alpha() cursorRect = cursor.get_rect()
游戏循环内代码
running = True while running: for event in pg.event.get(): if event.type == pg.QUIT: running = False # 必须填充背景,清除上一帧的光标残影 screen.fill((255, 255, 255)) x, y = pg.mouse.get_pos() # 仅当鼠标在窗口内时绘制自定义光标 if pg.mouse.get_focused(): # 更新光标位置为当前鼠标坐标 cursorRect.topleft = (x, y) screen.blit(cursor, cursorRect) pg.display.flip() pg.quit()
额外注意事项
- 每次循环必须用背景色填充窗口,否则上一帧的光标会在屏幕上留下残影,造成“光标停留”的错觉。
- 如果你的光标需要以中心对齐鼠标,可以把
cursorRect.topleft = (x, y)改成cursorRect.center = (x, y)。
内容的提问来源于stack exchange,提问作者Ahmed Mahmoud
相关产品推荐
相关产品推荐

