如何检测何时单击矩形对象、图像或精灵
Posted
技术标签:
【中文标题】如何检测何时单击矩形对象、图像或精灵【英文标题】:How to detect when a rectangular object, image or sprite is clicked 【发布时间】:2020-03-13 23:41:12 【问题描述】:我试图判断何时单击了必须属于特定组 (pygame.sprite.Group()
) 的精灵。目前我已经尝试创建一个只是鼠标位置且完全不可见的精灵,将其添加到自己的组中,并使用以下代码:
clickedList = pygame.sprite.spritecollide(guess1, mice, False)
其中guess1
是被点击的精灵,mice
是包含具有鼠标位置的精灵的组。
当我尝试这个时,我被告知“组没有属性 rect”。我从这里去哪里?
【问题讨论】:
您是否 100% 确定guess1
是 Sprite
实例?看起来不像。
这能回答你的问题吗? how to detect if the sprite has been clicked in pygame
@sloth 这是pygame.sprite.Group()
我需要使用精灵本身吗?
@Valentino 不,答案中链接的示例已经消失,我不太明白其余部分在说什么,因为这几乎就是我正在做的事情,至少到目前为止据我所知。
【参考方案1】:
如果你有一个精灵 (my_sprite
) 并且你想验证鼠标是否在精灵上,那么你必须获取 pygame.sprite.Sprite
对象的 .rect
属性并测试鼠标是否在.collidepoint()
的矩形区域内:
mouse_pos = pygame.mouse.get_pos()
if my_sprite.rect.collidepoint(mouse_pos):
# [...]
pygame.sprite.Group
中的 Sprite 可以迭代。所以可以循环进行测试:
mouse_pos = pygame.mouse.get_pos()
for sprite in mice:
if sprite.rect.collidepoint(mouse_pos):
# [...]
或者获取组内的精灵列表,鼠标所在的位置。如果 Sprite 不重叠,则列表将包含 0 或 1 个元素:
mouse_pos = pygame.mouse.get_pos()
clicked_list = [sprite for sprite in mice if sprite.rect.collidepoint(mouse_pos)]
if any(clicked_list):
clicked_sprite = clicked_list[0]
# [...]
【讨论】:
我正在使用第二个,但它总是返回为假。mousePos = pygame.mouse.get_pos() for Circle in guess1: if Circle.rect.collidepoint(mousePos): ##...
问题可能出在精灵本身而不是条件上,还是我只是在这里遗漏了一些愚蠢的东西? (对不起,代码在 cmets 中格式不正确。)
我用它来定义类class Circles(pygame.sprite.Sprite): def __init__ (self, value, x, y): pygame.sprite.Sprite.__init__(self) self.value = value circleImage = pygame.image.load ("Outline.png") if value == 11: circleImage = pygame.image.load ("Unknown.png") self.image = pygame.Surface([40,40]) self.image.set_colorkey(WHITE) self.image.blit(circleImage,(0,0)) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y
并使用display.flip
绘图
如果它更简单,我已经在谷歌文档here中获得了所有代码
是的,它是一个组。
@Nico 但它似乎工作正常guess1
是第二行的 4 个圆圈。如果你想改变圆圈的颜色,那么你必须在changeColour
的末尾添加self.image.blit(circleImage,(0,0))
以上是关于如何检测何时单击矩形对象、图像或精灵的主要内容,如果未能解决你的问题,请参考以下文章