还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了。接下来我们细说如何精确控制时间和运动。

主要内容: pygame的时间模块、动画的速度、向量的引入


一、pygame的时间模块

  time模块是pygame用来监测时间流动的模块。由于不同的电脑CPU处理指令的速度不同,性能有差异,对于同一个pygame游戏的动画就会出现动画速度不一致的现象。因此,有必要使用time模块来控制速度。

time模块: 常用函数

  pygame.time模块有很多测量时间的函数,它们的返回值都是一个常数,代表流逝的时间。pygame的时间是以毫秒(millisecond)来计算的,pygame中含有一个常量TIMER_RESOLUTION标记了一毫秒的长度。

1、pygame.time.get_ticks
语法:get_ticks() -> milliseconds
说明:返回值代表了自pygame.init()被调用以来经过的时间。在pygame.init()被调用之前,返回值始终为0

2、pygame.time.wait
语法:wait(milliseconds) -> time
说明:程序暂停给定的毫秒数。该函数占用很少的CPU使劲按,精度略低于delay()函数。

3、pygame.time.delay
语法:delay(milliseconds) -> time
说明:程序暂停给定的毫秒数。它使用CPU来精确控制时间,精确度高。

4、pygame.time.Clock
语法:Clock) -> Clock
说明:该函数返回一个跟踪时间的对象,该对象有很多计算时间的函数。
帧率:FPS(frame per second),代表了游戏画面的刷新速度,一般60帧的刷新频率就可以让画面看起来光滑逼真,对更高的帧率人眼基本上察觉不到变化了。

Clock对象 :常用函数

1、tick
语法:tick(framerate=0) -> milliseconds
说明:可以说,这个函数是非常好用了。在每一次画面刷新时,这个函数都会被调用,它返回距离上一次被调用经过的时间。如果传入可选的参数framerate,如下面的例子,此时该函数会产生延迟使游戏刷新频率低于40。

clock = pygame.time.Clock()
while True:time_passed = clock.tick(40)...

2、tick_busy_loop
语法:tick_busy_loop(framerate=0) -> milliseconds
说明:使用同tick()一样,只不过这个函数牺牲更多CPU时间来换取精确度

3、get_fps
语法:get_fps() -> float
说明:利用最后10次调用的Clock.tick()的返回值的平均值计算帧率并返回。


二、动画的速度

  前面提到了动画的速度,如果不使用时间模块来控制,系统的程序在不同的机器上运行结果可能不一样。还记得我们在讨论键盘事件时做的动画吗,兔子?跑的特别快。这里,我们试试用time模块来控制速度:
  我们知道,位移(displacement) = 速度(velocity) * 时间(time),而对于pygame窗口来说,surface对象的移动是在不同坐标的绘制,我们只需要控制在相同时间里,坐标(x, y)的增量相同就可以啦。先看几行代码:

import pygame, sys
from pygame.locals import *pygame.init()
pygame.display.set_caption("constant speed")
screen = pygame.display.set_mode((640,480), 0, 32)
rabbit = pygame.image.load("rabbit.png")(x, y) = (0, 0)
speed = 100
clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 计算时间并转化为secondstime_passed = clock.tick(2)time_passed_seconds = time_passed / 1000x += time_passed_seconds * speedy += time_passed_seconds * speedscreen.fill((200,200,255))screen.blit(rabbit, (x, y))pygame.display.update()

  上面的代码使用了Clock对象,坐标(x, y)的值由speed和时间控制,兔兔?每秒钟只移动100(speed = 100)个像素,下面是关键代码。
  刷新频率只是影响了运动的平滑程度,不影响移动的平均速度,比如我们把frame rate设为1,则隔1秒小兔子移动100px,而设置为2时,可以发现每0.5秒小兔子移动50px,结果一样,可以实践验证。

clock = pygame.time.Clock()
while True:time_passed = clock.tick(2)time_passed_seconds = time_passed / 1000x += time_passed_seconds * speedy += time_passed_seconds * speed

三、向量的引入

  数学对向量的定义是带方向的量,在pygame里面,向量只不过是一个元组,我们可以自己编写一个向量类,包含 获取模magnitude()、标准化normalize()以及各种重载运算符等方法。不过也利用现成的向量库可以使用,gameobjects库包含了Vector2、Vector3、Vector4等向量模块,下载一个gameobjects库,可以方便的在pygame中使用向量。

Vector2 —— 使用

step1:导入类

from gameobjects.vector2 import Vector2

step2:创建类对象

vector = Vector(3, 4)

step3:调用类方法

x = vector.get_x()
mag = vector.get_magnitude()
vector_normalized = vector.get_normalized()

Vector2 —— 主要函数

函数 功能
Vector(x, y) 构造函数,生成vector对象
get_x() 返回向量的x分量
set_x() 返回向量的x分量
get_length() 返回向量的长度
normalise() 将原向量标准化
get_normalise() 返回单位化的向量,不修改原向量
运算符重载 加、减、乘、(不)等于判断
from_points(p1, p2) 返回从点p1到点p2的向量

Vector2 —— 应用

  下面,我们利用向量来实现兔子追胡萝卜的动画,代码如下:

import pygame, sys
from pygame.locals import *
from gameobjects.vector2 import Vector2pygame.init()pygame.display.set_caption("rabbit eat carrot")
screen = pygame.display.set_mode((640, 480), 0, 32)
rabbit = pygame.image.load("rabbit.png")
carrot = pygame.image.load("carrot.png")speed = 100
direction = Vector2()
position = Vector2(300, 220)
clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()width = carrot.get_width()height = carrot.get_height()destination = (Vector2(*pygame.mouse.get_pos()) - Vector2(width/2, height/2))vector_to_mouse = Vector2.from_points(position, destination).get_normalised()time_passed = clock.tick()time_passed_seconds = time_passed / 1000position.x += time_passed_seconds*speed*vector_to_mouse.xposition.y += time_passed_seconds*speed*vector_to_mouse.yscreen.fill((255, 255, 255))screen.blit(carrot, destination)screen.blit(rabbit, position)pygame.display.update()

  我们使用了clock和speed常量来控制兔子的移动速度,使用从兔子当前位置position到鼠标destination方向上的单位向量vector_to_mouse控制兔子的运动方向。兔兔吃胡萝卜的GIF如下 (●’◡’●)


第四篇pygame学习笔记完结 cheers! ?

附上:代码压缩包
提取码:j8th


参考博客:用Python和Pygame写游戏-从入门到精通
图标引用:Iconfont

Pygame学习笔记 4 —— 时间与运动相关推荐

  1. Pygame学习笔记 6 —— 3D游戏

        pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...

  2. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

  3. 运动学习与控制-学习笔记(三)——运动控制理论

    运动学习与控制-学习笔记(三)--运动控制理论 一.理解控制理论以及两个重要概念 1.Motor Control Theory 2.两个重要概念:Coordination,Degree of Free ...

  4. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  5. 【Pygame 学习笔记】8.精灵

    术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...

  6. 《统计学》学习笔记之时间序列分析和预测

    鄙人学习笔记 文章目录 时间序列分析和预测 时间序列及其分解 时间序列的描述性分析 时间序列预测的程序 确定时间序列成分 选择预测方法 预测方法的评估 平稳序列的预测 简单平均法 移动平均法 指数平滑 ...

  7. javascript从入门到跑路-----小文的js学习笔记(25)------运动框架----匀速运动、缓冲运动、多物体运动、链式运动

    ** javascript从入门到跑路-----小文的js学习笔记(1)---------script.alert.document.write() 和 console.log 标签 javascri ...

  8. Go语学习笔记 - 增加时间工具 | Web框架Gin(五)

    学习笔记,写到哪是哪. 接着上一篇的文章:Go语学习笔记 - 跨域配置.全局异常捕获 | Web框架Gin(四)_剑客阿良_ALiang的博客-CSDN博客_gin全局异常捕获 在上一篇中已经将一些基 ...

  9. JS学习笔记十——时间常用方法

    前言 时间本身是 JS 中的一个数据类型 Date,是一种引用数据类型,其创建方式有两种:一是 new Date(),创建时间对象,且为当前终端的时间,即电脑时间:二是 new Date(年,月,日, ...

最新文章

  1. XCode 学习技巧之 User Scripts
  2. The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0
  3. 上海天氣情況及空氣質量指數
  4. C#中数据类型的安全转换(is,as)
  5. 二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法
  6. 使用Spring配置LogBack日志记录
  7. 关于VUE项目地图开发中大量点标记绘制一些总结
  8. sqlite插入时间字段_sqlite 获取最后插入id
  9. 深度学习要多深_才能读懂人话?
  10. JavaScript 的函数式编程与面向对象编程区别在哪?
  11. mysql学习day02
  12. 从《网管员必读》系列丛书获奖看读者的真正需求——成功原因分析(一)
  13. html基础知识补全
  14. Hbase Scan类 ResultScanner类
  15. linux下解除端口防火墙,Linux下防火墙配置、端口的开启和关闭
  16. 商城小程序上新的物流助手功能,可以为商家运营带来什么帮助?
  17. 自己开发的一套实用故障报修管理系统【分享推荐大家】
  18. 手机上html满屏飘爱心代码,微信满屏爱心怎么弄?微信满屏爱心特效方法步骤...
  19. 中国 vs 卡塔尔 一场幸运的比赛
  20. JS获取当前时间是否为节假日,周末

热门文章

  1. 计组作业【题目记录】
  2. VSCode PlatformIO IDE 下开发ESP32遇到的问题
  3. Windows压缩指定文件并删除原文件内容bat脚本
  4. zoj 1582 Careless Tony(水!)
  5. 笔记本计算机卡,笔记本电脑越来越卡怎么办 不同原因解决方法不同
  6. 小程序调取相机照片添加水印(时间水印)
  7. 乌云于 2014 年 02 月 17 日爆出支付宝登陆漏洞,该漏洞会对用户余额宝产生怎么样的影响或者是危害?
  8. [问题]假定网络中的路由器B的路由表有如下的项目(这三列分别表示“目的网络”、“距离”和“下一跳路由器”):
  9. 代码:吃货联盟订餐系统
  10. 209. 长度最小的子数组(中等 数组 滑动窗口)