Во втором вашем фрагменте я не уверен на 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.pos
возвращает координаты мыши в экранной системе координат: то есть позиция (0, 0)
равнаверхний левый угол окна экрана.
Однако прямоугольник, полученный из 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, которые можно использовать для последовательного отслеживания и положения объекта на экране.