如何使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()

抱歉,如果这不是nooby,请多多帮助

伊萨

除所有其他问题外,我不确定您的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()“使用指定的文本创建一个新的Surface”。(请参阅文档)这意味着您每次要更新文本时都必须重新渲染字体,否则,您将一次又一次地向同一(未更改的)表面喷字。您还需要调整rect以解决文本变宽的问题,然后时间从一位增加到两位。

跟踪时间的最简单方法可能是使用自定义用户事件,该事件在事件队列中每秒触发一次,如下所示:

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语句中)。

要查看如何处理定时事件的其他方法,请在pygame中每隔x(毫秒)秒执行一次操作

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章