когда я нажимаю кнопку, две кнопки нажимаются, Pygame - PullRequest
3 голосов
/ 28 марта 2019

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

import pygame
import time

pygame.init();
screen = pygame.display.set_mode((340,340));
img = pygame.image.load('3.gif')
iimg = pygame.image.load('2.gif')
mg = pygame.image.load('4.gif').convert()
g = pygame.image.load('5.gif')
waitingForInput = False
pygame.display.set_caption("SIMON");
BEEP1 = pygame.mixer.Sound('beep1.wav')
BEEP2 = pygame.mixer.Sound('beep2.wav')
BEEP3 = pygame.mixer.Sound('beep3.wav')
BEEP4 = pygame.mixer.Sound('beep4.wav')
screen.blit(img,(0,0))
screen.blit(mg,(150,0))
pygame.display.flip()

def main():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False

            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = event.pos

                if img.get_rect().collidepoint(mouse_pos):
                    print ('button was pressed at {0}'.format(mouse_pos))
                    BEEP1.play()
                    screen.blit(iimg,(0,0))
                    pygame.display.flip()
                    time.sleep(.30)
                    screen.blit(img,(0,0))
                    pygame.display.flip()


                if mg.get_rect().collidepoint(mouse_pos):
                    print ('button was pressed at {0}'.format(mouse_pos))
                    BEEP2.play()
                    screen.blit(g,(150,0))
                    pygame.display.flip()
                    time.sleep(.30)
                    screen.blit(mg,(150,0))
                    pygame.display.flip()

main()

1 Ответ

1 голос
/ 28 марта 2019

Если вы наберете get_rect для Surface, полученное значение Rect всегда будет иметь значение x и y 0.

. Поэтому при запускеif img.get_rect().collidepoint(mouse_pos) в цикле событий вы НЕ проверяете, нажали ли на Surface.Вы проверяете, находится ли положение мыши в верхнем левом углу экрана.

Возможно, используйте некоторые операторы print, чтобы проверить себя.

Что вы можете сделать, это создать Rect для каждой кнопки вне вашего основного цикла, а затем используйте эти ректы для блиттинга:

...
img = pygame.image.load('3.gif')
img_rect = img.get_rect()
...
mg = pygame.image.load('4.gif').convert()
mg_rect = img.get_rect(topleft=(150,0))
...
while True:
   ...
        if event.type == pygame.MOUSEBUTTONDOWN:
            mouse_pos = event.pos

            if img_rect().collidepoint(mouse_pos):
                BEEP1.play()

            if mg_rect ().collidepoint(mouse_pos):
                BEEP2.play()

    screen.blit(img, img_rect)
    screen.blit(mg, mg_rect)

Обратите внимание, что вам также следует избегать time.sleep или нескольких вызовов pygame.display.flip() вВаш основной цикл.

Другое решение заключается в использовании класса Sprite в Pygame, который позволяет комбинировать Surface и Rect.

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