Pygame не обнаруживает щелчки мыши

#The induvidual squares
class Square():
    def __init__(self,x,y):
        self.x = x
        self.y = y

#The grid as a whole
class Grid():
    def __init__(self,width,height):
        self.squares = []
        self.objects = []
        self.width = width
        self.height = height

    def populate(self):
        for i in range(1,self.height + 1):
            for j in range(1,self.width + 1):
                self.squares.append(Square(j,i))

grid = Grid(10,10)
grid.populate()
for i in grid.squares:
      grid.objects.append(pygame.Rect((i.x -1) * 50,(i.y - 1) * 50,50,50))

While True:

    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN :
            print("HELLO") #Testing to see if it worked
            (x,y) = pygame.mouse.get_pos()
            for i in grid.objects:
                if i.x*50 <= (x) < (i.x+1)*50:
                    if i.y*50 <= (y) < (i.y+1)*50:
                        print("hi") #Testing to see if it worked

Я экспериментировал с созданием сеток и использовал их для создания игр. Я искал возможность щелкнуть по определенному квадрату моей сетки, и это привело бы к изменению этого квадрата.

Здесь я пытался заставить его регистрировать, щелкнул ли я какие-либо квадраты, однако он не регистрировал, щелкнул ли я вообще. Я просмотрел другие обсуждения по этой теме, и ни одна из них не сработала.


person royaljames99    schedule 03.04.2020    source источник


Ответы (2)


Компоненты .x и .y объекта pygame.Rect содержат фактическую верхнюю левую позицию прямоугольника. Умножение на 50 неверно:

while True:

    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN :
            print("HELLO") #Testing to see if it worked
            x, y = pygame.mouse.get_pos()
            for obj_rect in grid.objects:
                if obj_rect.x <= x < obj_rect.x+50:
                    if obj_rect.y <= y < obj_rect.y+50:
                        print("hi") #Testing to see if it worked

В любом случае рекомендую упростить код и использовать collidepoint

x, y = pygame.mouse.get_pos()
for obj_rect in grid.objects:
    if obj_rect.collidepoint((x, y)):
        print("hi") #Testing to see if it worked

См. Также Как обнаруживать столкновения между двумя прямоугольными объектами или изображения в pygame

person Rabbid76    schedule 03.04.2020
comment
Никакой радости. Я думаю, что проблема больше связана с событием for в pygame.event.get (): if event.type == pygame.MOUSEBUTTONDOWN: Поскольку я даже не получаю ответ Hello, чтобы сказать, что я что-то нажал - person royaljames99; 03.04.2020
comment
@ royaljames99 Я проверил этот код. Работает нормально. Ваше состояние неправильное! Конечно, вы должны уважать отступы и While - ›while. Я отредактировал ответ. - person Rabbid76; 03.04.2020
comment
Я только что протестировал печать (событие) после события for в pygame, и он ничего не печатает, когда я нажимаю, поэтому я думаю, что это может быть связано с этим - person royaljames99; 03.04.2020

Я нашел исправление, связанное с тем, что у меня был другой

для события в pygame.event.get()

в том же цикле while. Эта проверка событий использовалась, чтобы определить, пытался ли я выйти из окна. Кажется, что у pygame есть проблема с двумя проверками событий в одном цикле, возможно, связанными с ними с использованием одного и того же имени переменной, в любом случае я переместил свою проверку в тот же цикл for, и теперь он работает

while True:

for event in pygame.event.get():
    print(event)
    if event.type == QUIT:
        pygame.quit()
        sys.exit()

    if event.type == pygame.MOUSEBUTTONDOWN :
        print("HELLO")
        x, y = pygame.mouse.get_pos()
        for obj_rect in grid.objects:
            if obj_rect.collidepoint((x, y)):
                print("hi") #Testing to see if it worked
person royaljames99    schedule 03.04.2020
comment
Похоже, что у pygame есть проблема с двумя проверками событий в одном цикле, но это не так. Это ожидаемое поведение. pygame.event.get() удаляет события из очереди. Таким образом, у вас не может быть 2 цикла событий, потому что только один из них будет получать события. Кроме того, было невозможно ответить на вопрос, потому что вы не показали 2-й цикл событий. Пожалуйста, не намекайте, что в pygame есть ошибка, и исправьте ответ. - person Rabbid76; 04.04.2020