修复了一个周期后代码无响应的错误

时间:2019-05-03 09:52:00

标签: python pygame

我正在尝试让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 :(得分:0)

您必须在for event in pygame.event.get():内使用while clicked才能从系统获取新事件。否则,您在event.typeeven.button中将具有相同的值。

即使pygame.mouse.get_pos()也无法正常工作,因为它使用了pygame.event.get()(或类似的文件)创建的数据

如果您有事件MOUSEBUTTONDOWNMOUSEBUTTONUP,那么您在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()