python动画精灵_Python游戏开发:pygame中的Sprite(精灵)模块和加载动画
一、Sprite模块、sprite对象
在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵。但是这个类的功能比较少,因此我们新建一个类对其继承,在sprite类的基础上丰富,以方便我们的使用。
首先来了解一下如何使用sprite类来加载动画吧。
1、精灵序列图
将要加载的动画帧放在一个精灵序列图里面,然后在程序里面调用它。pygame会自动更新动画帧,这样一个动态的图像就会展现在我们面前了。
下面是一个典型的精灵序列图:行和列的索引都是从0开始的。
2、加载精灵图序列:
在加载一个精灵图序列的时候,我们需要告知程序一帧的大小,(传入帧的宽度和高度,文件名)。
除此之外,还需要告诉精灵类,精灵序列图里面有多少列。load函数可以加载一个精灵序列图。
def load(self, filename, width, height, columns):
self.master_image = pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = 0,0,width,height
self.columns = columns
3.更新帧
一个循环动画通常是这样工作的:从第一帧不断的加载直到最后一帧,然后在折返回第一帧,并不断重复这个操作。
self.frame += 1
if self.frame > self.last_frame:
self.frame = self.first_frame
self.last_time = current_time
但是如果只是这样做的话,程序会一股脑地将动画播放完了,我们想让它根据时间间隔一张一张的播放,因此加入定时的代码。
pygame中的time模块有一个get_ticks()方法可以满足定时的需要。
ticks = pygame.time.get_ticks()
然后将ticks变量传递给sprite的update函数,这样就可以轻松让动画按照帧速率来播放了。哦,帧速率还没有设置,咱们现在设置一下帧速率。
启动一个定时器,然后调用tick(num)函数就可以让游戏以num帧来运行了。
framerate = pygame.time.Clock()
framerate.tick(60)
4、绘制帧
sprite.draw()方法是用来绘制帧的,但是这个函数是由精灵来自动调用的,我们没有办法重写它,因此需要在update函数里面做一些工作。
首先需要计算单个帧左上角的x,y位置值(x表示列编号,y表示行编号):
frame_x = (self.frame % self.columns) * self.frame_width
#用帧数目除以行数,然后在乘上帧的高度
frame_y = (self.frame // self.columns) * self.frame_height
然后将计算好的x,y值传递给位置rect属性。
frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = ( frame_x, frame_y, self.frame_width, self.frame_height )
self.image = self.master_image.subsurface(rect)
5、精灵组
当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事,那么有没有什么容器可以将这些精灵放在一起统一管理呢?答案就是精灵组。
pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。
使用pygame.sprite.Group()函数可以创建一个精灵组:
group = pygame.sprite.Group() group.add(sprite_one)
精灵组也有update和draw函数:
group.update() group.draw()
二、自定义的精灵类
好了,通过前面的学习,我们已经了解了一些精灵的知识了,现在我们将前面说到的方法封装成一个自定义的类,以方便我们的调用,这个类继承自pygame.sprite.Sprite:
class MySprite(pygame.sprite.Sprite):
def __init__(self, target):
pygame.sprite.Sprite.__init__(self) #基类的init方法
self.target_surface = target
self.image = None
self.master_image = None
self.rect = None
self.topleft = 0,0
self.frame = 0
self.old_frame = -1
self.frame_width = 1
self.frame_height = 1
self.first_frame = 0
self.last_frame = 0
self.columns = 1
self.last_time = 0
def load(self, filename, width, height, columns):
self.master_image = pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = 0,0,width,height
self.columns = columns
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width) * (rect.height // height) - 1
def update(self, current_time, rate=60):
#更新动画帧
if current_time > self.last_time + rate:
self.frame += 1
if self.frame > self.last_frame:
self.frame = self.first_frame
self.last_time = current_time
if self.frame != self.old_frame:
frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = ( frame_x, frame_y, self.frame_width, self.frame_height )
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
好了现在我们写一个小程序来测试一下这个类的性能怎么样。
这里我用ps制作了一个简单的精灵序列图,咱们就用这个萌萌的嗷大喵好了:
代码:
import pygame
from pygame.locals import *
class MySprite(pygame.sprite.Sprite):
def __init__(self, target):
pygame.sprite.Sprite.__init__(self)
self.target_surface = target
self.image = None
self.master_image = None
self.rect = None
self.topleft = 0,0
self.frame = 0
self.old_frame = -1
self.frame_width = 1
self.frame_height = 1
self.first_frame = 0
self.last_frame = 0
self.columns = 1
self.last_time = 0
def load(self, filename, width, height, columns):
self.master_image = pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = 0,0,width,height
self.columns = columns
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width) * (rect.height // height) - 1
def update(self, current_time, rate=60):
if current_time > self.last_time + rate:
self.frame += 1
if self.frame > self.last_frame:
self.frame = self.first_frame
self.last_time = current_time
if self.frame != self.old_frame:
frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = ( frame_x, frame_y, self.frame_width, self.frame_height )
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
pygame.init()
screen = pygame.display.set_mode((800,600),0,32)
pygame.display.set_caption("精灵类测试")
font = pygame.font.Font(None, 18)
framerate = pygame.time.Clock()
cat = MySprite(screen)
cat.load("sprite.png", 100, 100, 4)
group = pygame.sprite.Group()
group.add(cat)
while True:
framerate.tick(30)
ticks = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
key = pygame.key.get_pressed()
if key[pygame.K_ESCAPE]:
exit()
screen.fill((0,0,100))
group.update(ticks)
group.draw(screen)
pygame.display.update()
效果图:萌萌的嗷大喵跃然于屏幕上。看起来功能还不错的说。
python动画精灵_Python游戏开发:pygame中的Sprite(精灵)模块和加载动画相关推荐
- python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...
- Python脚本解决在游戏开发中的困难
Python脚本解决在游戏开发中的困难 新客网 XKER.COM 时间:2010-03-11 点击: 次 Python脚本是一种广泛应用于玩游戏开发的通信语言,在实际应用的过程中还是有不少的问题困扰 ...
- 基于python的植物大战僵尸游戏开发
1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于python的植物大战僵尸游戏开发. 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 21世纪是信息化时代,随着信息技术和网 ...
- 【课件】使用Python写贪吃蛇游戏(pygame)
使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...
- confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载
如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...
- 在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番
本系列专栏将通过不断编写游戏的方式,带你夯实 Python 知识. 本专栏追求迅速掌握 pygame 的同时,夯实 python 知识,所以一起来吧. Sprite 模块.Sprite 对象 精灵类与 ...
- python 游戏开发_Python游戏开发入门
spContent=--玩游戏的最高境界是什么? --当然是设计一款属于自己的游戏! --设计游戏不是目的,从游戏看道理,从道理看人生,人生何尝不是属于自己的游戏? --"弹指之间·享受创新 ...
- Python不能做游戏?Pygame中的对象你了解吗?
嗨喽-小伙伴们早上好,中午好,晚上好呀, 前面(点击跳转)我们学习了第一个Pygame程序,接着,我们来了解Pygame中最为常用的几个对象.学完今天的内容,我们就可以开发一个稍微复杂一 ...
- python游戏开发的第三方库有哪些_Python 游戏开发方向的第三方库是
Python 游戏开发方向的第三方库是 答:Pygame 内分泌器官包括( ) 答:甲状腺 松果体 甲状旁腺 垂体 我国的社会保险制度体系主要包括.医疗保险.失业保险.工伤保险.生育保险等内容 答:养 ...
最新文章
- Tensorflow从入门到精通之——Tensorflow基本操作
- servlet指定时间到现在过了多久_就喝一瓶啤酒,多久能开车?交警:过了这个时间,100%没问题...
- StackExchange.Redis通用封装类分享(转)
- DAS 2020 诚征论文及赞助!
- Oracle修改数据时提示“record is locked by another user”的解决办法
- OCS2007标准版服务器部署
- l4d2服务器修改武器伤害,辐射4武器伤害及护甲修改攻略
- [笔记]如何解决Your project contains C++ files but it is not using a supported native build system
- 公钥基础设施PKI体系介绍
- 2-常见机器学习模型总结
- macOS 工具 - 查看PKG文件内容:SuspiciousPackage 使用方法
- cesium获取经纬度
- ubuntu 上交叉编译 linaro 的库
- C++Primer第五版 第六章 课后习题答案
- mysql latch和缓存关系_latch:cachebufferschains等待事件导致的latch争用的原理原因与...
- QT连接MySQL数据库问题
- 栈的push,pop序列
- 无蓝光的护眼灯有哪些品牌?盘点无蓝光护眼灯排行榜
- dpkg: 处理软件包 xxxxxxxx (–configure)时出错:
- 原神它的认可任务如何完成
热门文章
- springcloud-eureka简单实现
- php课程 10-35 php实现文件上传的注意事项是什么
- bankbone 模型简单介绍
- Open Graphics Library初步_搭建环境_GLUT
- 新年了,我也来kuso一下.......(yy帖~~)
- 解决IDEA 中git 无法自动push 提交问题 Push failed: Failed with error: Could not read from remote repository.
- php中用date()取出的当前时间查8个小时的解决方法。
- MySQL双主如何解决主键冲突问题
- 【报告分享】2019年12月郭广昌混沌课程ppt(附下载链接)
- classification、part segmentation、semantic segmentation、instance segmentation