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

Pygame中rect.topleft与rect.collidepoint未被识别问题求助

问题分析与解决

你的代码存在三处关键问题,直接导致rect.topleft和rect.collidepoint无法被识别,同时还有一处逻辑错误,具体修正如下:

1. Rect对象未正确实例化(核心错误)

self.rect = self.image.get_rect  # 错误:仅赋值方法本身,未创建Rect实例

get_rect()是Pygame Surface的方法,必须加括号调用才能返回pygame.Rect实例。修正后:

self.rect = self.image.get_rect()  # 正确:调用方法获取Rect对象

如果不调用方法,self.rect只是一个函数对象,自然不具备Rect类的topleft属性和collidepoint()方法。

2. 鼠标释放判断逻辑错误

if pg.mouse.get_pressed == 0:  # 错误:未调用方法,直接比较函数对象

get_pressed()是方法,需要调用它并取第一个元素(对应鼠标左键)来判断是否释放:

if pg.mouse.get_pressed()[0] == 0:  # 正确:判断左键是否处于释放状态

3. blit方法参数格式错误

surface.blit()的第二个参数需要是坐标元组或Rect对象,你当前传入了两个单独的数值,需调整为:

surface.blit(self.image, self.rect)  # 简洁写法:直接传入Rect对象
# 或 surface.blit(self.image, (self.rect.x, self.rect.y))

修正后的完整代码

import pygame, pygamecolors

pg = pygame
pgc = pygamecolors

class Button():
    def __init__(self, x, y, image, scale):
        width = image.get_width()
        height = image.get_height()
        self.image = pg.transform.scale(image, (int(width * scale), int(height * scale)))
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.clicked = False

    def draw(self, surface):
        action = False
        pos = pg.mouse.get_pos()

        if self.rect.collidepoint(pos):
            if pg.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
                action = True

            if pg.mouse.get_pressed()[0] == 0:
                self.clicked = False

        surface.blit(self.image, self.rect)
        return action

内容的提问来源于stack exchange,提问作者Ethan Green

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:45:28