前两天写了一个使用blit  实现动画的文章.今天我们我们用 另一个方法surface来实现精灵动画.这两个方法本质上的区别在于.  blit()   是直接把图像绘制在surface表面.而subsurface()是先将图像提取子表面.然后通过Sprite.draw, 或者Group.draw将自表面绘制出来.

在使用的时候主要还是看个人习惯.对于我来说一般在写一些只做单词循环的动画,比如飞机爆炸产生的火花,我就用blit(),如果是需要不断循环的动画,比如英雄的动作.我喜欢用sub

关于surface.subfurface()方法的工作原理,我这里有一张简单的图来说明. 

在这里要注意的是,要使用子表面实现动画时,类中要有两个rect参数,第一个是self.rect这个rect参数是实例的rect属性,在使用sprite.draw(),或者group.draw()的时候,作为位置参数传递给方法.第二个rect参数是框架参数,也就是你要提取的一个子表面的大小.在公式中,我们用

self.frame_rect.x = (self.frame % 4) * self.frame_rect.width
self.frame_rect.y = (self.frame // 4) * self.frame_rect.height

来计算子表面框架在剪切时所处的位置.

对了这里有一个地方要说明一下.subsurface()这个方法在提取子表面的时候,默认的topleft是0,0.  也就是说,如果你想让动画绘制在屏幕某一个坐标的时候.记得要在frame_rect(子表面框架)变量声明了以后再去更改self.rect的坐标值.

完整的代码如下,这次用的是一个在网上找的爆炸火花.

完整的代码如下:

#coding = utf-8import pygame,sys
from pygame.sprite import Sprite
from pygame.sprite import Groupclass Mysprite(Sprite):def __init__(self):super().__init__()self.mast_image = pygame.image.load('2233.jpg') #读取图像self.rect = self.mast_image.get_rect() #获取图像矩形参数self.frame_rect = self.rect.copy() #声明框架参数self.rect.x,self.rect.y = 400,300  #这里是我实验的动画坐标绘制,如果把这两个参数放在第12行之前,那么就会报错,显示子表面绘制超出了范围 .self.frame_rect.width /= 4self.frame_rect.height /= 4self.frame = 0self.last_frame = (self.rect.width // self.frame_rect.width) * (self.rect.height // self.frame_rect.height) - 1self.old_frame = 1self.last_time = 0def update(self):self.current_time = pygame.time.get_ticks()rate = 100 #因为这个属性在别的地方不会有调用,所以这里我就写成了方法的局部变量if self.current_time >= self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = 0self.last_time = self.current_timeif self.old_frame != self.frame:self.frame_rect.x = (self.frame % 4) * self.frame_rect.widthself.frame_rect.y = (self.frame // 4) * self.frame_rect.heightself.old_frame = self.frameself.image = self.mast_image.subsurface(self.frame_rect) #这里就是在生成子表面pygame.init()
screen = pygame.display.set_mode((800,600))
color = (255,255,255)
mysprite = Mysprite()
group = Group()
group.add(mysprite)
tick = pygame.time.Clock()while True:tick.tick(60)for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()screen.fill(color)group.update()group.draw(screen)pygame.display.update()

使用pygame.surface.subsurface() 来实现精灵动画相关推荐

  1. Pygame Surface创建图像

    Pygame Surface创建图像 通过前面内容的介绍,我们对 Surface 对象有了大体上的认识.Pygame 针对文本.图像.颜色提供了不同模块来生成它们各自的 Surface 对象.Surf ...

  2. pygame 学习笔记(8)精灵动画的实现:子弹的爆炸效果

    本文内容 subsurface() 子 surface的学习 实现一个精灵动画 Note:本文代码基于上一小节,可以直接在上文文末下载工程文件. 在上一节中,我们只是让坦克移动起来,但不是真正的动画, ...

  3. Unity——通过Shader 制作精灵动画,瀑布

    //精灵动画 Shader "zhaoguanghui/spriteAction" { Properties { _MainTex ("Base (RGB)", ...

  4. pygame.surface.blit()方法4个参数的使用方法

    pygame.surface.blit方法将一个图像(Surface实例)绘制到另一个图像(Surface实例)上.如screen是一个Surface实例,方法blit具体使用方法如下: rect=s ...

  5. 太空射击第09课:精灵动画

    太空射击第09课:精灵动画 在本课中,我们将通过添加一些精灵动画来使我们的流星更有趣.本次课用到的图像可以点击这里下载 视频 观看视频 流星动画 pygame 中的transform模块 我们所有的流 ...

  6. 精灵动画Animation对话框组成Idle动画的各精灵

    精灵动画Animation对话框组成Idle动画的各精灵 场景中已经添加了精灵,现在是时候让让它动起来了.读者也许已经从精灵图集中,各精灵的命名中看出来了,这个精灵一共有两种动画状态:Idle(空闲) ...

  7. react开发模式_通过开发带有精灵动画的游戏来学习高级React模式

    react开发模式 by Pavel Vlasov 通过帕维尔·弗拉索夫(Pavel Vlasov) 通过开发带有精灵动画的游戏来学习高级React模式 (Learn advanced React p ...

  8. 如何将unity3d动画嵌入html,在Unity3D中使用精灵动画引擎制作动画的两种方法

    7月28日消息,如今的游戏玩家对于游戏角色的动作要求越来越高,给开发者提出了众多的要求,工作量也相应上升.那么如何才能简单快速地制作角色动画以提升效率呢?下面就和大家分享两个在Unity3D中使用精灵 ...

  9. cocos2d-x 中创建 CCSprite 精灵动画

    本文原创版权归 博客园 Terry_龙 所有,转载请标明原创作者及出处,以示尊重! 作者:Terry_龙 原文:http://www.cnblogs.com/TerryBlog/archive/201 ...

最新文章

  1. CentOS下MySQL的彻底卸载
  2. ASP.NET MVC Json的序列化和反序列化
  3. babyion 加载obj模型_在vue中使用babylonjs引入3d模型,打印mesh数据正常且无报错,但未在场景中显示,请问是什么环节出现了问题?...
  4. c语言链表交换2个元素的位置,C语言 单链表 查找一个元素出现的所有位置
  5. 蓝桥杯 ALGO-4 算法训练 结点选择
  6. python统计文本单词总数_python统计文本文件内单词数量的方法
  7. java 常用汉字_中国常用汉字有多少
  8. 计算机实训学校目的和要求,计算机实习目的和要求
  9. pyltp安装失败python 3.7_pyltp模块安装问题
  10. 移动硬盘插入提示需要格式化RAW_内存卡无法格式化解决办法
  11. 32位,64位系统寻址空间及最大内存
  12. 004_Makefile的编译
  13. php判断支付宝,PHP怎样判断是否为支付宝客户端
  14. 好心情:吃精神科药物药不见效?你可能忽视了血药浓度
  15. CTFshow 击剑杯 部分WP
  16. 晨曦记账本快速搜索收支账的基础操作
  17. 查看局域网其他电脑的计算机名和IP
  18. 在安装matlab时,报:找不到必需的文件。(要使用文件安装密钥,您必须从包含安装文件的目录运行安装程序)
  19. React控制台警告Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until
  20. I2C通讯过程中SDA被一直拉低

热门文章

  1. html2canvas图片生成file格式传送到后台服务器
  2. 机器学习笔记-Adaptive Boosting
  3. LaTeX 表格用法
  4. Numpy库中对axis(轴)的详解
  5. 为什么开了数据不能上网_补过的轮胎不能开高速?为什么改装车喜欢外八?年前的最后一期K哥问答!...
  6. 那个信奉“人沉静时智慧升起”的思想者
  7. GOPRO 6 相关
  8. 用友政务适时推出全国产财政管理软件
  9. Qt 连接mysql数据库 QSql
  10. 排列组合问题的C++代码