使用pygame.surface.subsurface() 来实现精灵动画
前两天写了一个使用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() 来实现精灵动画相关推荐
- Pygame Surface创建图像
Pygame Surface创建图像 通过前面内容的介绍,我们对 Surface 对象有了大体上的认识.Pygame 针对文本.图像.颜色提供了不同模块来生成它们各自的 Surface 对象.Surf ...
- pygame 学习笔记(8)精灵动画的实现:子弹的爆炸效果
本文内容 subsurface() 子 surface的学习 实现一个精灵动画 Note:本文代码基于上一小节,可以直接在上文文末下载工程文件. 在上一节中,我们只是让坦克移动起来,但不是真正的动画, ...
- Unity——通过Shader 制作精灵动画,瀑布
//精灵动画 Shader "zhaoguanghui/spriteAction" { Properties { _MainTex ("Base (RGB)", ...
- pygame.surface.blit()方法4个参数的使用方法
pygame.surface.blit方法将一个图像(Surface实例)绘制到另一个图像(Surface实例)上.如screen是一个Surface实例,方法blit具体使用方法如下: rect=s ...
- 太空射击第09课:精灵动画
太空射击第09课:精灵动画 在本课中,我们将通过添加一些精灵动画来使我们的流星更有趣.本次课用到的图像可以点击这里下载 视频 观看视频 流星动画 pygame 中的transform模块 我们所有的流 ...
- 精灵动画Animation对话框组成Idle动画的各精灵
精灵动画Animation对话框组成Idle动画的各精灵 场景中已经添加了精灵,现在是时候让让它动起来了.读者也许已经从精灵图集中,各精灵的命名中看出来了,这个精灵一共有两种动画状态:Idle(空闲) ...
- react开发模式_通过开发带有精灵动画的游戏来学习高级React模式
react开发模式 by Pavel Vlasov 通过帕维尔·弗拉索夫(Pavel Vlasov) 通过开发带有精灵动画的游戏来学习高级React模式 (Learn advanced React p ...
- 如何将unity3d动画嵌入html,在Unity3D中使用精灵动画引擎制作动画的两种方法
7月28日消息,如今的游戏玩家对于游戏角色的动作要求越来越高,给开发者提出了众多的要求,工作量也相应上升.那么如何才能简单快速地制作角色动画以提升效率呢?下面就和大家分享两个在Unity3D中使用精灵 ...
- cocos2d-x 中创建 CCSprite 精灵动画
本文原创版权归 博客园 Terry_龙 所有,转载请标明原创作者及出处,以示尊重! 作者:Terry_龙 原文:http://www.cnblogs.com/TerryBlog/archive/201 ...
最新文章
- CentOS下MySQL的彻底卸载
- ASP.NET MVC Json的序列化和反序列化
- babyion 加载obj模型_在vue中使用babylonjs引入3d模型,打印mesh数据正常且无报错,但未在场景中显示,请问是什么环节出现了问题?...
- c语言链表交换2个元素的位置,C语言 单链表 查找一个元素出现的所有位置
- 蓝桥杯 ALGO-4 算法训练 结点选择
- python统计文本单词总数_python统计文本文件内单词数量的方法
- java 常用汉字_中国常用汉字有多少
- 计算机实训学校目的和要求,计算机实习目的和要求
- pyltp安装失败python 3.7_pyltp模块安装问题
- 移动硬盘插入提示需要格式化RAW_内存卡无法格式化解决办法
- 32位,64位系统寻址空间及最大内存
- 004_Makefile的编译
- php判断支付宝,PHP怎样判断是否为支付宝客户端
- 好心情:吃精神科药物药不见效?你可能忽视了血药浓度
- CTFshow 击剑杯 部分WP
- 晨曦记账本快速搜索收支账的基础操作
- 查看局域网其他电脑的计算机名和IP
- 在安装matlab时,报:找不到必需的文件。(要使用文件安装密钥,您必须从包含安装文件的目录运行安装程序)
- React控制台警告Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until
- I2C通讯过程中SDA被一直拉低