Pygame(十六)时间
前情提要
前言
无论是动画,还是游戏时间的概念都极为重要.
无论是动画,还是游戏中都有一个重要的概念:,帧数
意思是一秒内几副图
前面,我们都是用time模块的sleep()函数来实现控制帧数的目的.
但是实际上,电脑对我们事件的响应是有需要时间的.而我们用time模块的sleep()功能是不会考虑CPU的用时的,假装CPU能瞬间处理所有的事情.
因此,这样的做法会带来一些不稳定因素,即这个帧速其实是会随着要处理的东西的增多而变的与实际目标相差更多大.反应到游戏(动画)中,看上去,就会感觉有点卡.
我们在玩大型游戏,或者手机游戏的时候感觉到画面卡,就是因为CPU的处理速度没有达到预期的速度,从而不受控件的造成帧速不对而变得不流畅,从而变成了卡的情况
本节提要
内容详情
get_ticks
看一下官方开发文档的内容:
返回自pygame.init()调用以来的毫秒数。在pygame初始化之前,这个总是为0。
示例代码:
def get_ticks()
time1 = pygame.time.get_ticks()
pygame.init()
pygame.display.set_mode((800,600))
pygame.display.set_caption("时间模块")
time2 = pygame.time.get_ticks()
print(time1)
print(time2)
效果图:
可以用这个来给游戏计时:
示例代码
def demo_get_ticks():
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("时间模块")
font = pygame.font.SysFont("fangsong", 32)
start_time = pygame.time.get_ticks()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 获取当前游戏时间
end_time = pygame.time.get_ticks()
# 计算游戏时间(即进入循环后的时间).如果要计算其他的时间,可以根据需要设置开始计时的位置
time = (end_time - start_time)//1000
# 输出文字内容
text_surface = font.render("游戏时间:" + str(time), True, "blue")
screen.fill("black")
screen.blit(text_surface, (0,0))
pygame.display.update()
效果图
wait
会暂停一个给定的毫秒数。这个函数可以休眠进程,以便与其他程序共享处理器。一个等待数毫秒的程序将消耗非常少的处理器时间。
他的返回值是实际的休眠时间
示例代码
def wait():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("时间模块")
font = pygame.font.SysFont("fangsong", 32)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 计算游戏时间(即进入循环后的时间).如果要计算其他的时间,可以根据需要设置开始计时的位置
before_wait = pygame.time.get_ticks()
pygame.time.wait(100)
end_wait = pygame.time.get_ticks()
time = (end_wait - before_wait)
# 输出文字内容
text_surface = font.render("休息时间2秒,实际间隔时间:" + str(time) + "毫秒", True, "blue")
screen.fill("black")
screen.blit(text_surface, (0, 0))
pygame.display.update()
效果图
可以看到,wait()有非常少的误差.
delay
会暂停一个给定的毫秒数。这个函数将使用处理器(而不是休眠)来使延迟.因此效果比wait()更精准
示例代码
def delay():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("时间模块")
font = pygame.font.SysFont("fangsong", 32)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
dtime = pygame.time.delay(100)
# 输出文字内容
text_surface = font.render("休息时间2秒,实际间隔时间:" + str(dtime) + "毫秒", True, "blue")
screen.fill("black")
screen.blit(text_surface, (0, 0))
pygame.display.update()
效果图
如图,时间不会变. 而wait()时间会变
Clock
Clock 是一个时间管理类
使用的时候,要先创建Clock的实例.
Clock有如下方法:
方法 | 用途 |
---|---|
pygame.time.Clock.tick | 新时钟 |
pygame.time.Clock.tick_busy_loop | 更新时钟 |
pygame.time.Clock.get_time | 在前一个滴答声中使用的时间 |
pygame.time.Clock.get_rawtime | 在前一个滴答声中使用的实际时间 |
pygame.time.Clock.get_fps | 计算时钟帧速率 |
这里我们只给出tick方法与get_fps方法
Clock.tick 和 Clock.get_fps
tick方法用来设置游戏帧率
示例代码
def clock_tick():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("时间模块")
font = pygame.font.SysFont("fangsong", 32)
clock = pygame.time.Clock() # 实例化Clock类
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 获取当前游戏时间
# 计算游戏时间(即进入循环后的时间).如果要计算其他的时间,可以根据需要设置开始计时的位置
fps = clock.get_fps() # 获取游戏帧率
# 输出文字内容
text_surface = font.render("游戏帧率是:" + str(fps), True, "blue")
screen.fill("black")
screen.blit(text_surface, (0, 0))
pygame.display.update()
clock.tick(60) # 设置帧率
效果科
使用注意:
- 实例化Clock: clock = pygame.time.Clock()
- 在每次循环的末尾调用一下tick方法: clock.tick(60) 用来设置帧率,控制循环的时间
- get_fps()可以帮助我们掌握实际帧率有没有达成预期.如果误差太大,说明我们的程序设计的不太合理,要适当的优化游戏或者调整帧率
后记
这里留了个set_timer方法.下节课在讲.