Как заставить pygame отображать время и изменять его при изменении времени с помощью шрифтов?

У меня есть работающие цифровые часы на python, но я застрял, пытаясь сделать их визуальными в pygame.

Код часов работает, но ничего не отображает, хотя я использовал для этого .blit.

Идея состоит в том, чтобы таймер показывал каждую минуту (секунду), час (каждые 60 секунд) и дни (каждые 12 часов игры). Это должно появиться в верхнем левом углу.

Вот мой код:

import sys, pygame, random, time
pygame.init()

#Screen
size = width, height = 1280, 720 #Make sure background image is same size
screen = pygame.display.set_mode(size)

done = False

#Animation
A1=0
A2=0

#Time Info
Time = 0
Minute = 0
Hour = 0
Day = 0
counter=0

#Colour
Black = (0,0,0)
White = (255, 255, 255)

#Fonts
Font = pygame.font.SysFont("Trebuchet MS", 25)

#Day
DayFont = Font.render("Day:"+str(Day),1, Black)
DayFontR=DayFont.get_rect()
DayFontR.center=(985,20)
#Hour
HourFont = Font.render("Hour:"+str(Hour),1, Black)
HourFontR=HourFont.get_rect()
HourFontR.center=(1085,20)
#Minute
MinuteFont = Font.render("Minute:"+str(Minute),1, Black)
MinuteFontR=MinuteFont.get_rect()
MinuteFontR.center=(1200,20)

#Images

Timer=pygame.time.get_ticks

Clock = pygame.time.Clock()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(White)

    #Timer
    if Time<60:
        time.sleep(1)
        Minute=Minute+1
        if Minute == 60:
            Hour=Hour+1
            Minute=0
        if Hour==12:
            Day=Day+1
            Hour=0

    if A1==0:
        A1=A1+1
        A2=A2+1
        time.sleep(1)
        if A1==1 or A2==1:
            A2=A2-1
            A1=A1-1         
    if A1==1:
        screen.blit(MinuteFont, MinuteFontR)
        screen.blit(HourFont, HourFontR)
        screen.blit(DayFont, DayFontR)
    if A2==0:
        screen.fill(pygame.Color("White"), (1240, 0, 40, 40))


    pygame.display.flip()

    Clock.tick(60)

pygame.quit()

Извините, если это нуби, но любая помощь приветствуется


person Joshua    schedule 27.06.2016    source источник


Ответы (1)


За исключением всех других проблем, я не уверен, какими должны быть ваши A1 и A2, но

if A1==0: #true for the first run through
    A1=A1+1 #A1 = 1
    A2=A2+1
    time.sleep(1)
    if A1==1 or A2==1: #always true, since A1==1
        A2=A2-1
        A1=A1-1 #A1 = 0

это всегда будет увеличивать A1 и сбрасывать его на ноль на том же шаге, по сути ничего не делая, поэтому вы никогда не дойдете до той части if A1==1, где вы могли бы сократить время.

Кроме того, Font.render() «создает новую поверхность с отрисованным на ней указанным текстом». (см. документацию). вам нужно повторно отображать шрифт каждый раз, когда вы хотите обновить текст, иначе вы продолжаете повторять одну и ту же (неизменную) поверхность снова и снова. Вам также нужно будет настроить прямоугольник, чтобы учесть, что текст становится шире, чем время увеличивается с одной цифры до двух.

Самый простой способ отслеживать время - использовать настраиваемое пользовательское событие, которое запускается каждую секунду в очереди событий, например:

import pygame
pygame.init()

#Screen
size = width, height = 1280, 720 #Make sure background image is same size
screen = pygame.display.set_mode(size)

done = False

#Time Info
Time = 0
Minute = 0
Hour = 0
Day = 0
counter=0

#Colour
Black = (0,0,0)
White = (255, 255, 255)

#Fonts
Font = pygame.font.SysFont("Trebuchet MS", 25)

#Day
DayFont = Font.render("Day:{0:03}".format(Day),1, Black) #zero-pad day to 3 digits
DayFontR=DayFont.get_rect()
DayFontR.center=(985,20)
#Hour
HourFont = Font.render("Hour:{0:02}".format(Hour),1, Black) #zero-pad hours to 2 digits
HourFontR=HourFont.get_rect()
HourFontR.center=(1085,20)
#Minute
MinuteFont = Font.render("Minute:{0:02}".format(Minute),1, Black) #zero-pad minutes to 2 digits
MinuteFontR=MinuteFont.get_rect()
MinuteFontR.center=(1200,20)

Clock = pygame.time.Clock()
CLOCKTICK = pygame.USEREVENT+1
pygame.time.set_timer(CLOCKTICK, 1000) # fired once every second

screen.fill(White)
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == CLOCKTICK: # count up the clock
            #Timer
            Minute=Minute+1
            if Minute == 60:
                Hour=Hour+1
                Minute=0
            if Hour==12:
                Day=Day+1
                Hour=0
            # redraw time
            screen.fill(White)
            MinuteFont = Font.render("Minute:{0:02}".format(Minute),1, Black)
            screen.blit(MinuteFont, MinuteFontR)
            HourFont = Font.render("Hour:{0:02}".format(Hour),1, Black)
            screen.blit(HourFont, HourFontR)
            DayFont = Font.render("Day:{0:03}".format(Day),1, Black)
            screen.blit(DayFont, DayFontR)

            pygame.display.flip()

    Clock.tick(60) # ensures a maximum of 60 frames per second

pygame.quit()

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

Чтобы узнать о других методах обработки событий, рассчитанных по времени, ознакомьтесь с Делайте что-нибудь каждые x ( милли) секунд в pygame.

person Isa    schedule 27.06.2016
comment
Большое спасибо, дружище. Эта информация мне тоже очень поможет. :) Я на самом деле так долго зацикливался на этом, я рад, что вы ей помогли :) - person Joshua; 28.06.2016