专栏首页Urlteampygame-游戏开发学习笔记(八)–pygame.time&&fps 动画制作

pygame-游戏开发学习笔记(八)–pygame.time&&fps 动画制作

让图片动起来,顺手做个小屏保。

https://github.com/luyishisi/The_python_code/tree/master/python_game/8.fps

理解帧率

这是一个被说烂了的词,FPS(Frame Per Second)是游戏和硬件间较量的永恒话题,我也不想多插话了,相信玩游戏的朋友都知道。

只是记住几个常用的量:一般的电视画面是24FPS;30FPS基本可以给玩家提供流程的体验了;LCD的话,60FPS是常用的刷新率,所以你的游戏的帧率再高也就没什么意义了;而绝大多数地球人都无法分辨70FPS以上的画面了!

直线运动

我们先来看一下初中一开始就学习的直线运动,我们让一开始的程序中出现的那条鱼自己动起来~

有一个解决上述问题的方法,就是让我们的动画基于时间运作,我们需要知道上一个画面到现在经过了多少时间,然后我们才能决定是否开始绘制下一幅。pygame.time模块给我们提供了一个Clock的对象,使我们可以轻易做到这一些:

	
clock = pygame.time.Clock()
time_passed = clock.tick()
time_passed = clock.tick(30)

第一行初始化了一个Clock对象;第二行的意识是返回一个上次调用的时间(以毫秒计);第三行非常有用,在每一个循环中加上它,那么给tick方法加上的参数就成为了游戏绘制的最大帧率,这样的话,游戏就不会用掉你所有的CPU资源了!但是这仅仅是“最大帧率”,并不能代表用户看到的就是这个数字,有些时候机器性能不足,或者动画太复杂,实际的帧率达不到这个值,我们需要一种更有效的手段来控制我们的动画效果。

为了使得在不同机器上有着一致的效果,我们其实是需要给定物体(我们把这个物体叫做精灵,Sprite)恒定的速度。这样的话,从起点到终点的时间点是一样的,最终的效果也就相同了,所差别的,只是流畅度。看下面的图试着理解一下~

我们把上面的结论实际试用一下,假设让我们的小鱼儿每秒游动250像素,这样游动一个屏幕差不多需要2.56秒。我们就需要知道,从上一帧开始到现在,小鱼应该游动了多少像素,这个算法很简单,速度*时间就行了,也就是250 * time_passed_second。不过我们刚刚得到的time_passed是毫秒,不要忘了除以1000.0,当然我们也能假设小鱼每毫秒游动0.25像素,这样就可以直接乘了,不过这样的速度单位有些怪怪的……

#coding:utf-8
background_image_filename = '1.jpg'
sprite_image_filename = '2.jpg'

import pygame
from pygame.locals import *
from sys import exit

pygame.init()
screen = pygame.display.set_mode((1024,800),0,32)

background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename)

clock = pygame.time.Clock()

x = 0.0
speed = 250

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    screen.blit(background,(0,0))
    screen.blit(sprite,(x,100))

    time_passed = clock.tick()
    time_passed_seconds = time_passed / 1000.0

    distance_moved = time_passed_seconds * speed
    x += distance_moved

    if x >1024:
        x-=1024 
    
    pygame.display.update()

好了,这样不管你的机器是更深的蓝还是打开个记事本都要吼半天的淘汰机,人眼看起来,不同屏幕上的鱼的速度都是一致的了。请牢牢记住这个方法,在很多情况下,通过时间控制要比直接调节帧率好用的多。

斜线运动

下面有一个更有趣一些的程序,不再是单纯的直线运动,而是有点像屏保一样,碰到了壁会反弹。不过也并没有新的东西在里面,原理上来说,反弹只不过是把速度取反了而已~ 可以先试着自己写一个,然后与这个对照一下。

#coding:utf-8
background_image_filename = '1.jpg'
sprite_image_filename = '2.jpg'

import pygame
from pygame.locals import *
from sys import exit

pygame.init()
screen = pygame.display.set_mode((1024,800),0,32)

background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename)

clock = pygame.time.Clock()

x ,y =100.,100.
speed_x ,speed_y = 133.,170.

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
    screen.blit(background,(0,0))
    screen.blit(sprite,(x,y))

    time_passed = clock.tick(30)
    time_passed_seconds = time_passed / 1000.0

    x += speed_x * time_passed_seconds
    y += speed_y * time_passed_seconds
   
    if x > 1024 - sprite.get_width():
        speed_x = -speed_x
        x = 1024 - sprite.get_width()
    elif x < 0: speed_x = -speed_x x = 0. if y > 800 - sprite.get_height():
        speed_y = -speed_y
        x = 800 - sprite.get_height()
    elif y < 0:
        speed_y = -speed_y
        y = 0.

    pygame.display.update()

原创文章,转载请注明: 转载自URl-team

本文链接地址: pygame-游戏开发学习笔记(八)–pygame.time&&fps 动画制作

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习-用Python和Pygame写游戏-从入门到精通(6)

    本文干货很多,so给一个传送门,咱们就不搬砖了。http://python.jobbole.com/83523/

    十四君
  • pygame-游戏开发学习笔记(五)–pygame.Font,字体与中文以及错误检测的问题

    本节内容基本属于干货,代码在github上:包括了字体和图片文件可以直接拉下来测试https://github.com/luyishisi/The_crawle...

    十四君
  • pygame-游戏开发学习笔记(二)–模块表与背景图样例。

    if pygame.font is None: print "The font module is not available!" exit()

    十四君
  • python_web5

    星辉
  • Python任务调度之sched

    这次我们主要讲解下Python自带模块当中的sched,不但小巧,也很强大,在实际应用中,某些场合还是可以用到的。作为一名Linux的SA,我们已经习惯了用cr...

    py3study
  • 初试 Kubernetes 集群中 Spinnaker 平台之集群管理

    上一篇文章 初试 Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台 中,我们演示了如何在 Kubernetes 集群中通过 Helm ...

    哎_小羊
  • 【DB笔试面试779】在Oracle中,SYS.SMON_SCN_TIME基表的作用是什么?

    SYS.SMON_SCN_TIME基表用于记录过去时间段中SCN与具体的时间戳(timestamp)之间的映射关系,因为是采样记录这种映射关系,所以SMON_S...

    小麦苗DBA宝典
  • Python多线程多进程实例对比解析

    可以看到在耗cpu的应用中,多进程明显优于多线程 2.6130592823028564 < 3.905290126800537

    砸漏
  • 编程小白 | 每日一练(186)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • PyTorch入门视频笔记-PyTorch初见

    2002年 Torch 框架发布,Torch 是一个基于 BSD License 的开源机器学习框架,但是由于 Torch 框架支持的是比较小众的 Lua 开发...

    触摸壹缕阳光

扫码关注云+社区

领取腾讯云代金券