如何实现鼠标锁定游戏窗口边界及ESC解锁、暂停恢复功能?
鼠标锁定与游戏暂停功能实现方案
核心实现逻辑
要实现鼠标锁定在游戏窗口内,主要依赖Pygame的两个核心API:
pygame.event.set_grab(True):捕获鼠标输入,阻止鼠标移出窗口范围pygame.mouse.set_pos():强制将鼠标位置限制在窗口边界内,避免初始位置异常
以下是修改后的完整代码,同时修复了原代码中重复调用start()的逻辑bug:
import pgzrun import pygame WIDTH = 800 HEIGHT = 600 # 全局状态变量初始化 exit = False playing = False def start(): global exit, playing exit = False playing = True pygame.mouse.set_visible(False) # 锁定鼠标到窗口内 pygame.event.set_grab(True) # 确保鼠标位置在窗口范围内 mouse_x, mouse_y = pygame.mouse.get_pos() clamped_x = max(0, min(mouse_x, WIDTH)) clamped_y = max(0, min(mouse_y, HEIGHT)) pygame.mouse.set_pos((clamped_x, clamped_y)) def update(): global exit, playing # 按下ESC且游戏运行时,触发暂停 if keyboard.Escape and playing: exit = True pygame.mouse.set_visible(True) # 解锁鼠标 pygame.event.set_grab(False) playing = False # 暂停状态下点击窗口,恢复游戏 if exit and mouse.LEFT: start() def draw(): screen.fill((0, 0, 0)) # 填充黑色背景,避免文字重叠 if exit: screen.draw.text("Paused", (200, 200), color=(255,255,255), fontsize=60) screen.draw.text('Click to continue', (150, 280), color=(255,255,255), fontsize=40) # 初始化启动游戏 start() pgzrun.go()
关键改动说明
- 全局变量初始化:将
exit和playing移到函数外初始化,避免重复定义导致的状态混乱 - 鼠标锁定与解锁:
- 启动游戏时调用
pygame.event.set_grab(True)锁定鼠标,同时修正鼠标位置确保在窗口内 - 暂停时调用
pygame.event.set_grab(False)解锁鼠标,恢复自由移动权限
- 启动游戏时调用
- 修复重复调用bug:移除原代码中
update()里的if playing: start(),改为初始化时调用start()启动游戏,避免每帧重复重置鼠标状态 - 界面优化:添加背景填充,调整暂停提示文字的位置和大小,提升可读性
内容的提问来源于stack exchange,提问作者Konstantinos Paliotzikas
相关产品推荐
相关产品推荐

