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
相关产品推荐
相关产品推荐

