#python #pygame
#python #pygame
Вопрос:
Когда я нажимаю кнопку, нажимаются две кнопки. Я создал изображения, которые действуют как кнопка, но когда я нажимаю первую кнопку, вторая кнопка тоже нажимается. Я новичок в 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. .. еще одно замечание: возможно, вы захотите изменить
software prgrammer at apple
наsoftware programmer at apple
в своем профиле 😉
Ответ №1:
Если вы вызываете 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
и a Rect
.