调用mouse.set_visible(False)后mouse.set_pos不生效、mouse.get_pos返回异常问题
问题根因
这是Pygame隐藏系统光标后的已知底层行为:调用mouse.set_visible(False)后,Pygame会进入相对鼠标输入的内部逻辑,此时mouse.get_pos()默认读取的是事件队列中缓存的鼠标坐标,而非系统光标实时位置。mouse.set_pos()修改的是系统级光标位置,该改动必须等下一次事件队列刷新(调用pygame.event.pump()或完成一轮事件处理)后,才会同步到mouse.get_pos()的返回值中,隐藏光标后该同步的触发条件会比光标可见时更严格。
可行解决方案
- 调用
mouse.set_pos()后主动刷新事件队列,示例修改如下:
mouse.set_pos(screen.get_width() / 2, screen.get_height() / 2) pygame.event.pump() # 主动刷新事件队列同步光标状态 start_pos = (screen.get_width() / 2, screen.get_height() / 2) print(mouse.get_pos() == start_pos)
- 自行维护自定义光标坐标:既然你已经要实现自定义光标,完全可以声明一个独立变量存储光标坐标,监听
MOUSEMOTION事件时更新该变量,渲染阶段直接用该变量绘制自定义光标图片,绕开mouse.get_pos()的同步问题,性能也更优。 - 替换透明光标替代隐藏光标:不使用
mouse.set_visible(False),而是将系统光标替换为完全透明的自定义光标,该模式下mouse.get_pos()、mouse.set_pos()的行为和光标可见时完全一致,不会出现同步异常。示例代码:
# 生成1x1尺寸的透明光标 transparent_surf = pygame.Surface((1, 1), pygame.SRCALPHA) transparent_cursor = pygame.cursors.Cursor((0, 0), transparent_surf) pygame.mouse.set_cursor(transparent_cursor)
内容的提问来源于stack exchange,提问作者Luphaestus
相关产品推荐
相关产品推荐

