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

Pygame光标进入指定区域时矩形移动异常:位移30像素后自动回退

核心问题原因
  • 两个矩形对象ex、exz的初始化放在了主循环内部,每一轮循环都会重置为初始坐标,所以移动后下次循环立刻回到初始位置,无法持续移动。
  • 矩形绘制、屏幕刷新、填充的代码全部放在主循环外,永远不会被执行,导致画面无正常更新、闪烁。
  • 光标位置判断逻辑写在了事件遍历循环内部,仅当有事件触发时才会执行位置校验,且没有做变量初始化防护,可能出现未定义报错;原有碰撞判定逻辑不符合「光标进入任意矩形范围」的需求,pygame内置的Rect.collidepoint()方法可以直接完成点碰撞检测,不需要手写逻辑。
  • pygame.quit()执行后没有退出程序,会触发后续代码报错。
  • 事件类型直接使用魔数可读性极差,建议使用pygame内置常量。
修复后完整代码
import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((700,500))
# 矩形初始化移到循环外,仅初始化一次
ex = pygame.Rect(30,30,60,60)
exz = pygame.Rect(0,30,30,60)
# 提前初始化光标位置变量
cursor_pos = (0,0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
          pygame.quit()
          sys.exit()
        if event.type == pygame.MOUSEMOTION:
           cursor_pos = pygame.mouse.get_pos()
           # 调试打印可以按需保留
           # print(f"{cursor_pos[1]}=y")
           # print(f"{cursor_pos[0]}=x")
           # print(f"{exz.x}exz.x, {exz.y}exz.y")
    
    # 碰撞判断移到事件循环外,每轮循环都校验
    if ex.collidepoint(cursor_pos) or exz.collidepoint(cursor_pos):
        exz.right += 30
        ex.right += 30
        # print(f"exz: {exz.x}, {exz.y}")
        # print(f"exs: {ex.x}, {ex.y}")
        pygame.display.set_caption("Cursor is in area")
    else:
        pygame.display.set_caption("Cursor is not in area")

    # 绘制逻辑移到循环内,顺序为先填充背景,再画元素,再刷新
    screen.fill((50,50,50))
    pygame.draw.rect(screen,(255,0,0),ex)
    pygame.draw.rect(screen,(0,255,0),exz)
    pygame.display.update()
修复说明
  • 矩形初始化移到主循环外,仅执行一次,修改后的坐标可以持续保留
  • 绘制逻辑调整到循环内,调整执行顺序为「填充背景→绘制矩形→刷新画面」,避免闪烁
  • 碰撞检测改用pygame内置的collidepoint方法,直接判断光标是否在任意矩形范围内,符合需求
  • 新增sys.exit()在退出pygame后直接终止程序,避免报错
  • 替换魔数为pygame内置常量,代码可读性更高

内容的提问来源于stack exchange,提问作者C-Gabibbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:05