Таймер обратного отсчета не запускается с заданным значением - PullRequest
1 голос
/ 02 августа 2020

это моя игровая функция с основным l oop. Проблема в том, что мой таймер с включением clock.tick(60) отсчитывает от 100 (назначенное значение), но со скоростью, меньшей, чем секунды (около 2 секунд). Без clock.tick(60) обратный отсчет начинается с 100, затем сразу же переходит к 97, а затем продолжается с темпом чуть дольше секунд. Все, что я знаю, это то, что помимо clock.tick (60), milliseconds += clock.tick(60) также имеет эффект. Есть ли способ гарантировать, что обратный отсчет начинается со 100 и имеет секундные интервалы, не влияя отрицательно на столь необходимый fps? Если потребуется еще такой код, я с радостью отправлю его.

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

def Gameplay():
    global P1_sped
    global P1_speed
    global P2_sped
    global P2_speed
    global Touch
    global player1_Lives
    global player2_Lives
    global P1_score
    global P2_score
    global done
    
    Player_1_turn = True
    Player_2_turn = False
    P1_Turns = 3
    P2_Turns = 3

    resetTimer = 100
    clock = pygame.time.Clock()
    seconds = 100
    milliseconds = 0


    
    P1_sped = P1_sped + 1
    P1_speed = P1_speed - 1
    print(P1_sped, "sped")
    print(P1_speed, "speed")
    Countdown = True
    done = False

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
                
            # Keydown movement bindings
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    P2.changespeed(P2_speed, 0)
                if event.key == pygame.K_RIGHT:
                    P2.changespeed(P2_sped, 0)
                if event.key == pygame.K_UP:
                    P2.changespeed(0, P2_speed)
                if event.key == pygame.K_DOWN:
                    P2.changespeed(0, P2_sped)
                if event.key == pygame.K_a:
                    P1.changespeed(P1_speed, 0)
                if event.key == pygame.K_d:
                    P1.changespeed(P1_sped, 0)
                if event.key == pygame.K_w:
                    P1.changespeed(0, P1_speed)
                if event.key == pygame.K_s:
                    P1.changespeed(0, P1_sped)
                    
            # Keyup movement bindings          
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    P2.changespeed(P2_sped, 0)
                if event.key == pygame.K_RIGHT:
                    P2.changespeed(P2_speed, 0)
                if event.key == pygame.K_UP:
                    P2.changespeed(0, P2_sped)
                if event.key == pygame.K_DOWN:
                    P2.changespeed(0, P2_speed)
                if event.key == pygame.K_a:
                    P1.changespeed(P1_sped, 0)
                if event.key == pygame.K_d:
                    P1.changespeed(P1_speed, 0)
                if event.key == pygame.K_w:
                    P1.changespeed(0, P1_sped)
                if event.key == pygame.K_s:
                    P1.changespeed(0, P1_speed)
        

        #milliseconds += clock.tick_busy_loop(60) #returns the time since the last time we called the function, and limits the frame rate to 60FPS
        milliseconds += clock.tick(60)
                    
      

        #  Applying an update to the sprites
        all_sprite_list.update()

        #  Backgorund colour
        screen.fill(D_BLUE)

        #  Applying the sprites
        all_sprite_list.draw(screen)

        #  The countdown used before the game starts
        if Countdown == True:
        
            screen.blit(THREE, (SCREEN_WIDTH/2-53.5,SCREEN_HEIGHT/2-91.5))
            pygame.display.update()
            time.sleep(1)
            screen.fill(D_BLUE)
            all_sprite_list.draw(screen)
            #pygame.draw.rect(screen, BLACK,(SCREEN_WIDTH/2-250,SCREEN_HEIGHT/2-250,500,500))

            screen.blit(TWO, (SCREEN_WIDTH/2-52,SCREEN_HEIGHT/2-88.5))
            pygame.display.update()
            time.sleep(1)
            screen.fill(D_BLUE)
            all_sprite_list.draw(screen)
            #pygame.draw.rect(screen, BLACK,(SCREEN_WIDTH/2-250,SCREEN_HEIGHT/2-250,500,500))

            screen.blit(ONE, (SCREEN_WIDTH/2-39,SCREEN_HEIGHT/2-87))
            pygame.display.update()
            time.sleep(1)

            Countdown = False
            
        if milliseconds > 1000:
            seconds -= 1
            milliseconds -= 1000
        if seconds == 0:
            #Countdown = True
            P1.reset(500, 500)
            P2.reset(800, 500)
            if Player_1_turn:
                P1_score += 1000
                P1_Turns -= 1
                Countdown = True
                seconds = resetTimer
                if P1_Turns == 0:
                    Text("GameOver Player1", 100, WHITE, SCREEN_WIDTH/2, SCREEN_HEIGHT/2-350)
                    pygame.display.update()
                    time.sleep(1)
                    Player_2_turn = True
                    Player_1_turn = False
            else:
            #if Player_2_turn == True or Player_1_turn == False:
                P2_score += 1000
                P2_Turns -= 1
                Countdown = True
                seconds = resetTimer
                if P2_Turns == 0:
                    Text("GameOver Player2", 100, WHITE, SCREEN_WIDTH/2, SCREEN_HEIGHT/2-350)
                    pygame.display.update()
                    time.sleep(1)
                    #GameEnd()
                    CharSel()
        #print(P1_score, "P1 score")
        #print(P2_score, "P2 score")
                

        Text(seconds, 100, WHITE, SCREEN_WIDTH/2, SCREEN_HEIGHT/2-350)
     
        pygame.display.flip()
        #  Used for fps
        clock.tick(60)
        
StartScreen()
pygame.quit()

1 Ответ

2 голосов
/ 02 августа 2020

Вы дважды звоните clock.tick(60) в свой основной l oop. Один раз, когда вы делаете milliseconds += clock.tick(60), и один раз в конце l oop. Если вы прочитаете документы , вы увидите следующее: « Этот метод следует вызывать один раз для каждого кадра. Он вычислит, сколько миллисекунд прошло с момента предыдущего вызова. Если вы передадите необязательный аргумент частоты кадров, функция будет задерживать, чтобы игра продолжала работать медленнее, чем заданные тики в секунду '.

Так что, если вы вызываете его дважды за l oop эффект будет выполнять l oop с половиной ожидаемой частоты кадров. Поскольку вы вызываете его с помощью 60, это означает, что ваша частота кадров на самом деле будет 30 кадров в секунду.

Кроме того, возврат - это количество времени с момента последнего вызова. Поскольку вы вызываете его дважды, вызов в верхней части l oop вернет время с момента вызова в нижней части l oop, а не с момента последнего вызова из верхней части l oop. Таким образом, в вашей игре будет отсчитываться только половина времени l oop, что объясняет, почему вы пытаетесь считать 1 секунду, а 2 секунды проходят.

Вам нужно удалить одну из два вызова clock.tick(60)

EDIT:

У вас есть раздел Countdown == True, который использует 3 секунды при первоначальном запуске. Этот обратный отсчет происходит между первым milliseconds += clock.tick(60) и следующим clock.tick(60). Эти 3 секунды возвращаются, а затем скрываются clock.tick(60), тогда как без этого они будут возвращены как 3000 мс в milliseconds += clock.tick(60), и поэтому отображаемое время быстро уменьшится на эти 3 секунды.

Вероятно, вы могли бы скрыть эту потерю времени, добавив clock.tick() сразу после Countdown = False внутри блока if Countdown == True.

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