Pygame学习笔记 4 —— 时间与运动
还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用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 —— 时间与运动相关推荐
- Pygame学习笔记 6 —— 3D游戏
pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...
- Python可视化物理随机过程---pygame学习笔记2
Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...
- 运动学习与控制-学习笔记(三)——运动控制理论
运动学习与控制-学习笔记(三)--运动控制理论 一.理解控制理论以及两个重要概念 1.Motor Control Theory 2.两个重要概念:Coordination,Degree of Free ...
- Python第三方库pygame学习笔记(一)
Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...
- 【Pygame 学习笔记】8.精灵
术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...
- 《统计学》学习笔记之时间序列分析和预测
鄙人学习笔记 文章目录 时间序列分析和预测 时间序列及其分解 时间序列的描述性分析 时间序列预测的程序 确定时间序列成分 选择预测方法 预测方法的评估 平稳序列的预测 简单平均法 移动平均法 指数平滑 ...
- javascript从入门到跑路-----小文的js学习笔记(25)------运动框架----匀速运动、缓冲运动、多物体运动、链式运动
** javascript从入门到跑路-----小文的js学习笔记(1)---------script.alert.document.write() 和 console.log 标签 javascri ...
- Go语学习笔记 - 增加时间工具 | Web框架Gin(五)
学习笔记,写到哪是哪. 接着上一篇的文章:Go语学习笔记 - 跨域配置.全局异常捕获 | Web框架Gin(四)_剑客阿良_ALiang的博客-CSDN博客_gin全局异常捕获 在上一篇中已经将一些基 ...
- JS学习笔记十——时间常用方法
前言 时间本身是 JS 中的一个数据类型 Date,是一种引用数据类型,其创建方式有两种:一是 new Date(),创建时间对象,且为当前终端的时间,即电脑时间:二是 new Date(年,月,日, ...
最新文章
- XCode 学习技巧之 User Scripts
- The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.0
- 上海天氣情況及空氣質量指數
- C#中数据类型的安全转换(is,as)
- 二分法求方程的根_快速求解方程的根——二分法与牛顿迭代法
- 使用Spring配置LogBack日志记录
- 关于VUE项目地图开发中大量点标记绘制一些总结
- sqlite插入时间字段_sqlite 获取最后插入id
- 深度学习要多深_才能读懂人话?
- JavaScript 的函数式编程与面向对象编程区别在哪?
- mysql学习day02
- 从《网管员必读》系列丛书获奖看读者的真正需求——成功原因分析(一)
- html基础知识补全
- Hbase Scan类 ResultScanner类
- linux下解除端口防火墙,Linux下防火墙配置、端口的开启和关闭
- 商城小程序上新的物流助手功能,可以为商家运营带来什么帮助?
- 自己开发的一套实用故障报修管理系统【分享推荐大家】
- 手机上html满屏飘爱心代码,微信满屏爱心怎么弄?微信满屏爱心特效方法步骤...
- 中国 vs 卡塔尔 一场幸运的比赛
- JS获取当前时间是否为节假日,周末
热门文章
- 计组作业【题目记录】
- VSCode PlatformIO IDE 下开发ESP32遇到的问题
- Windows压缩指定文件并删除原文件内容bat脚本
- zoj 1582 Careless Tony(水!)
- 笔记本计算机卡,笔记本电脑越来越卡怎么办 不同原因解决方法不同
- 小程序调取相机照片添加水印(时间水印)
- 乌云于 2014 年 02 月 17 日爆出支付宝登陆漏洞,该漏洞会对用户余额宝产生怎么样的影响或者是危害?
- [问题]假定网络中的路由器B的路由表有如下的项目(这三列分别表示“目的网络”、“距离”和“下一跳路由器”):
- 代码:吃货联盟订餐系统
- 209. 长度最小的子数组(中等 数组 滑动窗口)