Как проверить, находится ли щелчок мыши внутри прямоугольника для каждого прямоугольника в этой программе pygame?

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

Вот мой исходный код для рисования экрана:

import pygame
import sys

pygame.init()

size_x = 650
size_y = 550
bkg_colour = 0, 0, 0
white = 255, 255, 255
colour = 0, 130, 90
position_x, position_y = 70, 100
screen = pygame.display.set_mode((size_x, size_y))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        screen.fill(bkg_colour)

        for x in range(-50, 500, position_x + 20):
            for y in range(-50, 400, position_y + 20):
                pygame.draw.rect(screen, colour, (position_x + x, position_y + y, position_x, position_y), 0)

        pygame.display.flip()

Я пытался использовать pygame.Прямая и точка столкновения, как это:

for x in range(-50, 500, position_x + 20):
            for y in range(-50, 400, position_y + 20):
                rect_size = pygame.Rect(position_x + x, position_y + y, position_x, position_y)
                pygame.draw.rect(screen, colour, rect_size, 0)

if event.type == pygame.MOUSEBUTTONDOWN:
            click = rect_size.collidepoint(pygame.mouse.get_pos())

            if click == 1:
                print("Clicked")
                pygame.draw.rect(screen, white, rect_size, 0)

pygame.display.flip()

Но то, что он делает, работает только для последнего нарисованного прямоугольника на экране.
Как сделать так, чтобы он работал для каждого прямоугольника на экране?

1 ответ

  1. rect_size удерживает одно значение за раз, и вы переопределяете его снова и снова, пока он не удерживает последний прямоугольник.

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

    вместо

    rect_size = pygame.Rect(position_x + x, position_y + y, position_x, position_y)
    

    вы хотите сделать что-то вроде:

    rect_sizes.append(pygame.Rect(position_x + x, position_y + y, position_x, position_y))
    

    а затем повторите rect_sizesи проверьте столкновение с каждым из них.

    rect_sizes = []
    for x in range(-50, 500, position_x + 20):
        for y in range(-50, 400, position_y + 20):
            rect_size = pygame.Rect(position_x + x, position_y + y, position_x, position_y)
            pygame.draw.rect(screen, colour, rect_size, 0)
            rect_sizes.append(rect_size)
    
    if event.type == pygame.MOUSEBUTTONDOWN:
        for rect_size in rect_sizes:
            click = rect_size.collidepoint(pygame.mouse.get_pos())
    
            if click == 1:
                print("Clicked")
                pygame.draw.rect(screen, white, rect_size, 0)