
本文介绍如何使用pygame zero(pgz)结合底层pygame api,将鼠标光标限制在游戏窗口边界内,支持esc键暂停/解锁、鼠标点击恢复锁定,并保持光标隐藏/显示的正确状态。
本文介绍如何使用pygame zero(pgz)结合底层pygame api,将鼠标光标限制在游戏窗口边界内,支持esc键暂停/解锁、鼠标点击恢复锁定,并保持光标隐藏/显示的正确状态。
在 Pygame Zero 中,默认不提供直接锁定鼠标的高级接口,但可以通过调用底层 Pygame 的 pygame.event.set_grab() 实现光标捕获(即“锁定”到窗口内)。该函数并非改变鼠标位置,而是让系统将所有鼠标移动事件约束在窗口坐标范围内——即使鼠标物理移出窗口,其逻辑坐标仍被限制在 (0, 0) 到 (WIDTH-1, HEIGHT-1) 之间,从而实现“无法移出”的效果。
以下是完整、可运行的解决方案(已修复原代码中的关键逻辑缺陷,如避免递归调用 start()、正确处理鼠标点击恢复逻辑):
import pgzrun
import pygame
WIDTH = 800
HEIGHT = 600
# 全局状态变量
playing = True
mouse_locked = True # 标记当前是否处于锁定状态
def start_lock():
"""启用鼠标锁定:隐藏光标 + 捕获输入"""
pygame.mouse.set_visible(False)
pygame.event.set_grab(True) # ✅ 关键:锁定鼠标在窗口内
def unlock_mouse():
"""解除鼠标锁定:显示光标 + 释放捕获"""
pygame.mouse.set_visible(True)
pygame.event.set_grab(False) # ✅ 关键:释放锁定
def on_key_down(key):
global playing, mouse_locked
if key == keys.ESCAPE:
if playing:
# 暂停游戏:解锁鼠标、显示光标
playing = False
mouse_locked = False
unlock_mouse()
else:
# 恢复游戏:需等待鼠标点击(见 on_mouse_down)
pass
def on_mouse_down(pos):
global playing, mouse_locked
if not playing:
# 点击任意位置即恢复游戏
playing = True
mouse_locked = True
start_lock()
def update():
# 注意:不要在 update 中反复调用 start()!会导致无限递归或状态混乱
# 所有初始化/状态切换应通过事件回调(如 on_key_down/on_mouse_down)完成
pass
def draw():
screen.clear()
if not playing:
screen.draw.text("PAUSED", (WIDTH//2 - 100, HEIGHT//2 - 50),
color="white", fontsize=60)
screen.draw.text("Click anywhere to resume", (WIDTH//2 - 180, HEIGHT//2 + 20),
color="lightgray", fontsize=32)
# 初始化:首次启动即锁定鼠标
start_lock()
pgzrun.go()✅ 关键要点说明:
- pygame.event.set_grab(True) 是实现“鼠标不出窗”的核心,它向操作系统申请独占鼠标输入;False 则释放控制权。
- 切勿在 update() 中重复调用状态切换函数(如原代码中的 start()),否则会引发逻辑冲突与性能问题。应改用 PGZ 的事件钩子(on_key_down, on_mouse_down)响应用户操作。
- pygame.mouse.set_visible() 仅控制光标显示/隐藏,与 set_grab() 独立但常配合使用。
- on_mouse_down 在暂停状态下监听点击,比轮询 mouse.LEFT 更可靠、更符合 PGZ 编程范式。
⚠️ 注意事项:
- 在 Linux/X11 系统上,set_grab(True) 可能要求窗口具有焦点且为顶层窗口;若遇到异常,可尝试在 draw() 后添加 pygame.display.flip()(PGZ 内部已处理,通常无需干预)。
- 游戏退出前建议显式调用 unlock_mouse(),避免光标被残留锁定(本例中因程序结束自动释放,可选)。
通过以上实现,你将获得专业级的鼠标锁定体验:沉浸式游戏操作 + 平滑的暂停/恢复交互,完全契合典型 PC 游戏的设计需求。


















