如何在Pygame窗口中点击特定的位置?

3
比如说我有一个宽度为100(整型)的正方形。当我在正方形内部点击时,我想要打印出某些东西。
import pygame
pygame.init()

window = pygame.display.set_mode((200, 300))
button = pygame.image.load("button.png")
window.blit(button, (50, 50))
pygame.display.flip()

run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            if (50, 50) <= pos <= (150, 150):
               print("text...")

    pygame.display.update()

无论我在受限制的X轴之间单击什么,它都会打印一些内容,但如果我在该X轴之间的任何Y坐标上单击,它也会显示输入。例如,如果我单击(100, 100),它可以正常工作,但是即使我不希望它这样做,它也可以通过单击(100, 200)来工作。 我不知道我的问题是否与元组等有关,但据我所知,它只读取了X轴的限制,这就是问题所在。

1
它不能按照你的方式工作的原因是,你正在比较作为元组的值,这些值使用它们自己的规则。(50, 50) <= pos <= (150, 150) 要求 pos[0] 在50到150之间(包括50和150),并且当 pos[0] 等于50时,要求 pos[1] 至少为50,当 pos[0] 等于150时,要求 pos[1] 不超过150。所以,没错,这是“元组的东西”。 - Karl Knechtel
2个回答

2
如果您正在使用pygame,您可以将矩形创建为:
rect = pygame.Rect(x, y, w, h)

然后,当您按下鼠标时,请使用以下方法检查是否发生了碰撞:

if rect.collidepoint(mouse_x, mouse_y):
    print("text...")

rect.collidepoint 函数如果点在矩形内部返回 true。


1
它实际上是一个精灵,但我能在精灵上使用ColliderPoint吗?知道这一点会很有用。 - George Avrabos
不,根据文档(https://www.pygame.org/docs/ref/sprite.html),没有collidepoint方法。 - Hamolicious
1
所有的精灵都包含一个 Rect,可以通过 sprite.rect 访问它,因此您可以直接使用 collidepoint 进行碰撞检测。 - Kingsley

1

更改此部分:

        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            if (50, 50) <= pos <= (150, 150):
               print("text...")

To:

        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            if 50 <= pos[0] <= 150 and 50 <= pos[1] <= 150:
               print("text...")

或者你也可以将其更改为:


        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            if all(50<=c<=150 for c in pos):
               print("text...")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接