Исправление ошибки, когда код перестает отвечать на запросы после одного цикла - PullRequest
0 голосов
/ 03 мая 2019

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

def Reaction_game():
intro = True
while intro == True:
    for event in pygame.event.get():
        #Stops game when close is selected
        if event.type == pygame.QUIT:
            file=open('currentuser.txt', 'w') 
            file.close()
            pygame.quit()
            quit()
        Reaction_times=[]
        for x in range (5):
            clicked = False
            BackGround = Background("background1.png",[0,0])
            screen.fill(white)
            screen.blit(BackGround.image, BackGround.rect)
            pygame.draw.rect(screen, black,(0,0,1000,55))
            Font = pygame.font.SysFont('TitilliumWeb.ttf',72)
            Label = Font.render("Get Ready:", 1, white)
            screen.blit(Label, (380,0,325,75))
            pygame.display.update()
            time.sleep(2)
            screen.blit(BackGround.image, BackGround.rect)
            pygame.draw.rect(screen, black,(0,0,1000,55))
            Font = pygame.font.SysFont('TitilliumWeb.ttf',72)
            Label = Font.render("Go:", 1, white)
            screen.blit(Label, (450,0,325,75))
            pygame.display.update()

            RectX = randrange(50,950)
            RectY = randrange(60,513)
            round_rect(screen,(RectX,RectY,75,40),(black),10,5,(white))
            pygame.display.update()
            TimeStart = time.time()

            while clicked !=True:
                mouse = pygame.mouse.get_pos()
                if RectX+75 > mouse[0] > RectX and RectY+40 > mouse[1] > RectY:
                    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                        TimeEnd = time.time()
                        ReactionTime = TimeEnd - TimeStart
                        Reaction_times.append(ReactionTime)
                        clicked = True
                else:
                    pass
Reaction_game()

Я ожидаю, что код выполнит 5 итераций этой маленькой игры с временем реакции, но он даже не пройдетПервый цикл, прежде чем перестать отвечать.

1 Ответ

0 голосов
/ 03 мая 2019

Вы должны использовать for event in pygame.event.get(): внутри while clicked, чтобы получать новые события из системы.Без этого у вас есть одинаковые значения в event.type и even.button.

Даже pygame.mouse.get_pos() не может работать корректно, потому что он использует данные, созданные pygame.event.get() (или подобными)

Если у вас есть событие MOUSEBUTTONDOWN, MOUSEBUTTONUP, то у вас есть положение мышив event.pos и вам не нужно pygame.mouse.get_pos()

while not clicked:

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

        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            if RectX+75 > event.pos[0] > RectX and RectY+40 > event.pos[1] > RectY:
                TimeEnd = time.time()
                ReactionTime = TimeEnd - TimeStart
                Reaction_times.append(ReactionTime)
                clicked = True

РЕДАКТИРОВАТЬ:

Вы можете сохранить положение и размер прямоугольника в pygame.Rect()

   RectX = randrange(50,950)
   RectY = randrange(60,513)

   rect = pygame.Rect(RectX, RectY, 75, 40)

и затем вы можете использовать rect вместо (RectX,RectY,75,40)

   round_rect(screen, rect, black , 10, 5, white)

и вы можете использовать rect, чтобы проверить, нажали ли вы в прямоугольнике rect.collidepoint(event.pos)

    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
       if rect.collidepoint(event.pos):
           TimeEnd = time.time()
           ReactionTime = TimeEnd - TimeStart
           Reaction_times.append(ReactionTime)
           clicked = True

РЕДАКТИРОВАТЬ: рабочий пример с другими изменениями - т.е.Я использую pygame.time.wait() вместо time.sleep() и pygame.time.get_ticks() вместо time.time().Оба используют миллисекунды вместо секунд.

import pygame
import random

# --- constants ---

WHITE = (255, 255, 255)
BLACK = (  0,   0,   0)

# --- main ---

pygame.init()

screen = pygame.display.set_mode((1000, 600))

reaction_times= []

for x in range(5):
    clicked = False

    screen.fill(WHITE)
    pygame.draw.rect(screen, BLACK, (0, 0, 1000, 55))
    font = pygame.font.SysFont(None, 72)
    label = font.render("Get Ready:", 1, WHITE)
    screen.blit(label, (380, 0, 325, 75))
    pygame.display.update()

    pygame.time.wait(2000) # 2000ms = 2s

    pygame.draw.rect(screen, BLACK, (0, 0, 1000, 55))
    font = pygame.font.SysFont(None, 72)
    label = font.render("Go:", 1, WHITE)
    screen.blit(label, (450, 0, 325, 75))
    pygame.display.update()

    x = random.randrange(50, 950)
    y = random.randrange(60, 513)
    rect = pygame.Rect(x, y, 75, 40)

    pygame.draw.rect(screen, BLACK, rect)
    pygame.display.update()

    time_start = pygame.time.get_ticks()

    while not clicked:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                if rect.collidepoint(event.pos):
                    print('clicked')
                    time_end = pygame.time.get_ticks()
                    reaction_time = (time_end - time_start)/1000 # convert to seconds
                    reaction_times.append(reaction_time)
                    clicked = True

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