You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现鼠标锁定游戏窗口边界及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:30:12