一、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(精灵)模块和加载动画相关推荐

  1. python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...

  2. Python脚本解决在游戏开发中的困难

    Python脚本解决在游戏开发中的困难 新客网 XKER.COM 时间:2010-03-11  点击: 次 Python脚本是一种广泛应用于玩游戏开发的通信语言,在实际应用的过程中还是有不少的问题困扰 ...

  3. 基于python的植物大战僵尸游戏开发

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于python的植物大战僵尸游戏开发. 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 21世纪是信息化时代,随着信息技术和网 ...

  4. 【课件】使用Python写贪吃蛇游戏(pygame)

    使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...

  5. confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...

  6. 在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番

    本系列专栏将通过不断编写游戏的方式,带你夯实 Python 知识. 本专栏追求迅速掌握 pygame 的同时,夯实 python 知识,所以一起来吧. Sprite 模块.Sprite 对象 精灵类与 ...

  7. python 游戏开发_Python游戏开发入门

    spContent=--玩游戏的最高境界是什么? --当然是设计一款属于自己的游戏! --设计游戏不是目的,从游戏看道理,从道理看人生,人生何尝不是属于自己的游戏? --"弹指之间·享受创新 ...

  8. Python不能做游戏?Pygame中的对象你了解吗?

    嗨喽-小伙伴们早上好,中午好,晚上好呀, 前面(点击跳转​​​​​​​)我们学习了第一个Pygame程序,接着,我们来了解Pygame中最为常用的几个对象.学完今天的内容,我们就可以开发一个稍微复杂一 ...

  9. python游戏开发的第三方库有哪些_Python 游戏开发方向的第三方库是

    Python 游戏开发方向的第三方库是 答:Pygame 内分泌器官包括( ) 答:甲状腺 松果体 甲状旁腺 垂体 我国的社会保险制度体系主要包括.医疗保险.失业保险.工伤保险.生育保险等内容 答:养 ...

最新文章

  1. Tensorflow从入门到精通之——Tensorflow基本操作
  2. servlet指定时间到现在过了多久_就喝一瓶啤酒,多久能开车?交警:过了这个时间,100%没问题...
  3. StackExchange.Redis通用封装类分享(转)
  4. DAS 2020 诚征论文及赞助!
  5. Oracle修改数据时提示“record is locked by another user”的解决办法
  6. OCS2007标准版服务器部署
  7. l4d2服务器修改武器伤害,辐射4武器伤害及护甲修改攻略
  8. [笔记]如何解决Your project contains C++ files but it is not using a supported native build system
  9. 公钥基础设施PKI体系介绍
  10. 2-常见机器学习模型总结
  11. macOS 工具 - 查看PKG文件内容:SuspiciousPackage 使用方法
  12. cesium获取经纬度
  13. ubuntu 上交叉编译 linaro 的库
  14. C++Primer第五版 第六章 课后习题答案
  15. mysql latch和缓存关系_latch:cachebufferschains等待事件导致的latch争用的原理原因与...
  16. QT连接MySQL数据库问题
  17. 栈的push,pop序列
  18. 无蓝光的护眼灯有哪些品牌?盘点无蓝光护眼灯排行榜
  19. dpkg: 处理软件包 xxxxxxxx (–configure)时出错:
  20. 原神它的认可任务如何完成

热门文章

  1. springcloud-eureka简单实现
  2. php课程 10-35 php实现文件上传的注意事项是什么
  3. bankbone 模型简单介绍
  4. Open Graphics Library初步_搭建环境_GLUT
  5. 新年了,我也来kuso一下.......(yy帖~~)
  6. 解决IDEA 中git 无法自动push 提交问题 Push failed: Failed with error: Could not read from remote repository.
  7. php中用date()取出的当前时间查8个小时的解决方法。
  8. MySQL双主如何解决主键冲突问题
  9. 【报告分享】2019年12月郭广昌混沌课程ppt(附下载链接)
  10. classification、part segmentation、semantic segmentation、instance segmentation