无法触发颜色上的鼠标按下事件

Can't get Mouse down event on a color to trigger

我正在为一个学校项目创建一个回避游戏,我遇到了一个奇怪的错误,即当光标点击绿色时 MOUSEBUTTONDOWN 事件不会触发,("win color")即使几乎相同代码的相同版本确实有效,但颜色不同。

我当前的颜色事件代码是:

        pos = pygame.mouse.get_pos()
    color_at_cursor = screen.get_at(pos)

    if event.type == pygame.MOUSEBUTTONDOWN and color_at_cursor == (0, 0, 255, 255):
        print("Game Start")
        start_clicked = True
    if start_clicked and color_at_cursor == (0, 228, 255, 255):
        died = True
    if died:
        screen.blit(ded, ded_rect)
        if event.type == pygame.MOUSEBUTTONDOWN:
            is_alive = False

  if start_clicked and event.type == pygame.MOUSEBUTTONDOWN and color_at_cursor == (0, 255, 0, 255):
      screen.blit(win_screen, win_rect)
      if event.type == pygame.MOUSEBUTTONDOWN:
          is_alive = False

其中前 3 个 if 语句检查蓝色开始按钮是否被单击,以及光标是否触及 cyan/light 蓝色死亡颜色。这些语句按预期工作,但使用几乎完全相同概念的最终语句不起作用。单击绿色时,没有任何反应。我得出的结论是它不起作用的原因是因为所讨论的绿色位于与背景不同的单独对象上。但这仍然很奇怪,因为当光标悬停在平台上时,上面的第二个 IF 语句并没有导致立即死亡,(它的颜色与背景的青色死亡颜色不同)

无论如何,我尝试编写代码来检测对象顶部特定颜色的鼠标单击事件。如下所示:

if event.type == pygame.MOUSEBUTTONDOWN and start_clicked:
    x, y = event.pos
    if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0, 255):
        print("win button clicked")
        screen.blit(win_screen, win_rect)
        if event.type == pygame.MOUSEBUTTONDOWN:
            is_alive = False

这仍然没有任何结果。有谁知道我为什么 运行 遇到这个问题,我该如何解决它?

在你的第二个片段中,我不是 100% 确定 platform1 是什么,但我猜它是一个充满绿色的表面。

如果是这种情况,错误很可能是坐标的偏移。让我用下面的 MCVE 来说明这一点,这是你第二个片段的简化版本:

pygame.init()
screen = pygame.display.set_mode((800, 800))

platform1 = pygame.Surface((200, 200))
platform1.fill((0, 255, 0))
screen.blit(platform1, (300, 300))
pygame.display.update()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0):
                print("win button clicked")

现在这会在屏幕中间创建一个绿色方块,但是当您单击它时,"win button clicked" 不会打印出来(重现您描述的错误)。

原因是event.posreturns鼠标在屏幕坐标系中的坐标:即位置(0, 0)是屏幕的左上角window.
但是,您从 platform1.get_rect() 获得的矩形不知道矩形实际绘制的位置,因此它的原点被假定为 (0, 0) 而不是它是什么(在本例中为 (300, 300) )。所以你在检测点碰撞的时候出错了

如果将最后一个 if 块替换为:

    if event.type == pygame.MOUSEBUTTONDOWN:
        x, y = event.pos
        x -= 300
        y -= 300
        if platform1.get_rect().collidepoint(x,y) and platform1.get_at((x, y)) == (0, 255, 0):
            print("win button clicked")

它按预期工作,因为我们考虑了 (300, 300) 的偏移量。

这说明了问题,但当然不是解决问题的好方法,因为偏移量是硬编码的,不会对所有对象都相同。面对这种情况的最好方法是使用 Sprite 而不仅仅是 Surfaces,它可以用于以一致的方式跟踪对象在屏幕中的位置。