Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制

前言

基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。

我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。

私信我发送消息python资料,领取python crash course中文版PDF。

pygame

Pygame是一个开源的Python多媒体开发库,专门用于开发2D游戏。它是Python编程语言的一个扩展,基于 SDL (Simple DirectMedia Layer) 库,提供了丰富的功能来处理图形、声音、事件处理等游戏开发所需的基本要素,使得创建游戏变得更加简单直接。

时间与帧率控制

在Pygame中,时间和帧率控制对于游戏的流畅性和响应性至关重要。Pygame提供了pygame.time模块来处理时间相关的功能,其中最常用的是Clock类,用于控制游戏的帧率并提供时间测量。

Clock

pygame.time.Clock类在Pygame中用于管理游戏的帧率和执行定时操作。它提供了一种机制来限制游戏的循环速度,确保游戏不会运行得太快,同时也允许开发者精确地控制每一帧之间的延迟时间。

常用函数
  1. tick([fps])

    • 功能: 控制每秒最大帧数。如果游戏循环执行得比指定的fps快,tick()会暂停足够长的时间以达到目标帧率。
    • 参数:
      • fps: 可选参数,整数类型,表示每秒的最大帧数。如果不提供,默认为不设置上限。
    • 返回值: 上次调用tick()到本次调用之间经过的毫秒数。
    import pygame
    
    pygame.init()
    
    screen = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    
    show = True
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
    
        # 清除屏幕
        screen.fill((255, 255, 255))
    
        if show:
            # 绘制一个填充的红色圆
            pygame.draw.circle(screen, (255, 0, 0), (200, 100), 50)
            show = False
        else:
            # 绘制一个未填充的绿色圆
            pygame.draw.circle(screen, (0, 255, 0), (200, 200), 50, 5)
            show = True
    
        # 更新屏幕
        pygame.display.flip()
    
        # 控制帧率为1
        clock.tick(1)
        # clock.tick(10)
        # clock.tick(100)
    
        # 输出每帧的时间间隔
        print(f"Time since last frame: {clock.get_time()}ms")
    
        # 输出当前帧率
        print(f"Current FPS: {clock.get_fps():.2f}")
    

    代码中填充了两个图形来回切换,设置不同的帧率,可以明显看到切换速度的差距。

  2. tick_busy_loop([fps])

    • 功能: 类似于tick(),控制帧数
    • 参数: 同tick().
    • 返回值: 同tick().
    import pygame
    
    pygame.init()
    
    screen = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    
    show = True
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
    
        # 清除屏幕
        screen.fill((255, 255, 255))
    
        if show:
            # 绘制一个填充的红色圆
            pygame.draw.circle(screen, (255, 0, 0), (200, 100), 50)
            show = False
        else:
            # 绘制一个未填充的绿色圆
            pygame.draw.circle(screen, (0, 255, 0), (200, 200), 50, 5)
            show = True
    
        # 更新屏幕
        pygame.display.flip()
    
        # 控制帧率为1
        # clock.tick(1)
        # clock.tick(10)
        # clock.tick(100)
        clock.tick_busy_loop(1)
    
        # 输出每帧的时间间隔
        print(f"Time since last frame: {clock.get_time()}ms")
    
        # 输出当前帧率
        print(f"Current FPS: {clock.get_fps():.2f}")
    

    这个函数和tick函数是一个作用,区别在于这个函数使用CPU忙等待来实现目标帧率,这通常不推荐,因为它消耗更多CPU资源。

  3. get_time()

    • 功能: 返回自上次调用tick()以来经过的时间,单位是毫秒。
    • 参数: 无
    • 返回值: 自上次tick()调用到本次调用之间经过的毫秒数。
  4. get_fps()

    • 功能: 返回从上一次调用tick()到本次调用期间的平均帧率。
    • 参数: 无
    • 返回值: 平均帧率,如果tick()从未被调用则返回0。

在这里插入图片描述
两个函数的返回信息通常用于判断与计算,可以更准确地计算游戏逻辑中的时间依赖部分。

结尾

时间与帧数控制是游戏开发中至关重要的部分,它们直接影响游戏的流畅度、响应性和整体性能。但是我们目前来说不过过于关注这方面得到内容,了解会用就可以进入下一个阶段了。

下个阶段就是开始书籍资料的中的大战外星人游戏了。其实就是类似雷霆战机那种飞船打飞船或者外星人的小游戏。

  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值