pygame---精灵
出处@小五义 http://www.cnblogs.com/xiaowuyi
这篇博文讲精灵讲的蛮详细的
据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽、魂斗罗,却对精灵一点也不知。pygame.sprite.Sprite就是Pygame里面用来实现精灵的一个类,使用时,并不需要对它实例化,只需要继承他,然后按需写出自己的类就好了,因此非常简单实用。
一、什么是精灵
精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame绘制函数绘制的图像,也可以是原来就有的图像文件。
二、sprite中主要且常用的变量有以下几个:更多详细的见http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite
self.image这个负责显示什么。如self.image=pygame.Surface([x,y])说明该精灵是一个x,y大小的距形,self.image=pygame.image.load(filename)说明该精灵调用显示filename这个图片文件。
self.image.fill([color]),负责对self.image着色,如self.image=pygame.Surface([x,y])
self.image.fill([255,0,0])
对x,y距形填充红色。
self.rect负责在哪里显示。一般来说,先用self.rect=self.image.get_rect()获得image距形大小,然后给self.rect设定显示的位置,一般用self.rect.topleft(topright、bottomleft、bottomright)来设定某一个角的显示位置。另外,self.rect.top、self.rect.bottom、self.rect.right、self.rect.left分别表示上下左右。
self.update 负责使精灵行为生效。
Sprite.add 添加精灵到group中去。
Sprite.remove 从group中删除
Sprite.kill 从groups中全部删除精灵
Sprite.alive 判断精灵是否属于groups
三、建立一个简单的精灵
所有精灵在建立时都是从pygame.sprite.Sprite中继承的。
(1)做一个精灵,绘制一个宽30、高30的距形,具体代码如下:
![](/assets/blank.gif)
class Temp(pygame.sprite.Sprite):def __init__(self,color,initial_position):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([30,30])self.image.fill(color)self.rect=self.image.get_rect()self.rect.topleft=initial_position
![](/assets/blank.gif)
这里逐句进行一下分析,pygame.sprite.Sprite.__init__(self)完成初始化。self.image = pygame.Surface([30,30])定义显示30*30的一个距形surface。self.image.fill(color)用color来填充颜色。self.rect=self.image.get_rect()获取self.image大小。self.rect.topleft=initial_position确定左上角显示位置,当然也可以用topright、bottomrigh、bottomleft来分别确定其他几个角的位置。精灵的显示,在一个640*480大小的白色窗体[50,100]的位置绘制一个30*30大小的红色距形,完整代码如下:
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys pygame.init() class Temp(pygame.sprite.Sprite):def __init__(self,color,initial_position):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([30,30])self.image.fill(color)self.rect=self.image.get_rect()self.rect.topleft=initial_position screen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) b=Temp([255,0,0],[50,100]) screen.blit(b.image,b.rect) pygame.display.update() while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()
![](/assets/blank.gif)
(2)做一个精灵,显示内容为某一图片,这里以前面用过的小车图片为例,代码如下:
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys pygame.init() class Car(pygame.sprite.Sprite):def __init__(self,filename,initial_position):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()#self.rect.topleft=initial_positionself.rect.bottomright=initial_positionprint self.rect.rightscreen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) fi='ok1.jpg' b=Car(fi,[150,100]) screen.blit(b.image,b.rect) pygame.display.update() while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()
![](/assets/blank.gif)
这段代码与(1)的不同之处在于self.image定义为pygame.image.load(filename),用来显示filename文件,本代码使用了ok1.jpg文件,并定义了小车右底角的显示位置是[150,100]。
三、学习精灵组
(1)使用精灵在屏幕上放多个图像,这种方法没用利用精灵组的概念,而是利用了list来生成每一个精灵。Cargroup用来存储不同位置的Car,screen.blit(carlist.image,carlist.rect)逐个显示每一个精灵。具体见代码:
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys pygame.init() class Car(pygame.sprite.Sprite):def __init__(self,filename,initial_position):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.rect.bottomright=initial_positionscreen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) fi='ok1.jpg' locationgroup=([150,200],[350,360],[250,280]) Cargroup=[] for lo in locationgroup:Cargroup.append(Car(fi,lo)) for carlist in Cargroup:screen.blit(carlist.image,carlist.rect) pygame.display.update() while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()
![](/assets/blank.gif)
具体效果见图:
(2)使用精灵组来实现多个图像。上面精灵是存在一个列表中,很方便,就是有点不太好用。除了精灵,pygame还提供了精灵组,它很适合处理精灵列表,有添加,移除,绘制,更新等方法。具体如下:http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite
Group.sprites 精灵组
Group.copy 复制
Group.add 添加
Group.remove 移除
Group.has 判断精灵组成员
Group.update 更新
Group.draw 位块显示
Group.clear - 绘制背景
Group.empty 清空
同样还是上面的这个例子,这里用精灵组来实现。
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys pygame.init() class Car(pygame.sprite.Sprite):def __init__(self,filename,initial_position):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.rect.bottomright=initial_position screen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) fi='ok1.jpg' locationgroup=([150,200],[350,360],[250,280]) Cargroup=pygame.sprite.Group() for lo in locationgroup:Cargroup.add(Car(fi,lo))for carlist in Cargroup.sprites():screen.blit(carlist.image,carlist.rect) pygame.display.update() while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()
![](/assets/blank.gif)
两个例子都是在[150,200],[350,360],[250,280]三个位置显示三辆小车,不同之处第一个用的是list,第二个用的是精灵组。差别就在几句话上,一是Cargroup=pygame.sprite.Group()定义Cargroup为精灵组,二是Cargroup.add(Car(fi,lo))用add代替了append,三是for carlist in Cargroup.sprites()这句中逐个显示精灵,这里试了一下,直接用for carlist in Cargroup也是可以的。精灵组的代码是高度优化过了,常常比列表还快。插入和删除都是常见的操作,代码还可以避免内存在循环中反复消耗。
四、动画
利用精灵组做动画会显得比较方便,这里我们首先让上面的三辆小车运动起来。
(1)三辆小车以不同的速度前行,利用random.choice随机生成[-10,-1]之间的值作为速度让小车从下向上运动,并且当到达顶部时,再从底部出现。代码如下:
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys from random import * pygame.init() class Car(pygame.sprite.Sprite):def __init__(self,filename,initial_position,speed):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.rect.topleft=initial_positionself.speed=speeddef move(self):self.rect=self.rect.move(self.speed)if self.rect.bottom < 0: #当小车底部到达窗口顶部时,让小车从下面出来 self.rect.top=480 screen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) fi='ok1.jpg' locationgroup=([150,200],[350,300],[250,200]) Cargroup=pygame.sprite.Group() for lo in locationgroup:speed=[0,choice([-10,-1])]Cargroup.add(Car(fi,lo,speed))while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()pygame.time.delay(20)screen.fill([255,255,255])for carlist in Cargroup.sprites():carlist.move()screen.blit(carlist.image,carlist.rect)pygame.display.update()
![](/assets/blank.gif)
(2)可以通过左右键控制三辆小车的左右移动,按左键向左移动,当到达最左边时,不再移动,按右键向右移动,当到达最右边时,不再移动。具体代码如下:
![](/assets/blank.gif)
#小五义 http://www.cnblogs.com/xiaowuyi import pygame,sys from random import * pygame.init() class Car(pygame.sprite.Sprite):def __init__(self,filename,initial_position,speed):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(filename)self.rect=self.image.get_rect()self.rect.topleft=initial_positionself.speed=speeddef move(self):self.rect=self.rect.move(self.speed)if self.rect.bottom < 0: self.rect.top=480def moveleft(self):self.rect.left=self.rect.left-10if self.rect.left<0:self.rect.left=0def moveright(self):self.rect.right=self.rect.right+10if self.rect.right>640:self.rect.right=640 screen=pygame.display.set_mode([640,480]) screen.fill([255,255,255]) fi='ok1.jpg' locationgroup=([150,200],[350,300],[250,200]) Cargroup=pygame.sprite.Group() for lo in locationgroup:speed=[0,choice([-10,-1])]Cargroup.add(Car(fi,lo,speed))while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:if event.key==pygame.K_LEFT:for carlist in Cargroup.sprites():carlist.moveleft()screen.blit(carlist.image,carlist.rect)if event.key==pygame.K_RIGHT:for carlist in Cargroup.sprites():carlist.moveright()screen.blit(carlist.image,carlist.rect)pygame.time.delay(20)screen.fill([255,255,255])for carlist in Cargroup.sprites():carlist.move()screen.blit(carlist.image,carlist.rect)pygame.display.update()
pygame---精灵相关推荐
- Pygame学习笔记6:使用Pygame精灵以及Escape the Dragon
上一章介绍了位图编程的相关内容,这一章就开始实现动画操作,那么主要就是要来了解pygame.sprite模块. 在pygame.sprite模块中,有一个名为Sprite的类,我们需要对其进行扩展使其 ...
- pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)
HackPython 改名为「懒编程」,纯粹是因为我有另外一个写杂文的号叫「懒写作」,此外,感觉「懒编程」比 HackPython 好记. 前言 在第 5 节内容中,实现了积分机制.玩家死亡逻辑以及游 ...
- pygame精灵组有哪些方法_pygame 的精灵使用
pygame 的精灵使用 pygame.sprite.Sprite 是 pygame 中用来实现精灵的一个类,在使用时并不需要对它实例化,只需要继承它,然后按需写出自己的类,因此非常简单.使用. 1. ...
- Python编程从入门到实践---pygame精灵组
初学Python,跟着书上的外星人项目,写了一下,碰到一个这样的问题: AttributeError: 'Alien' object has no attribute 'add_internal' 找 ...
- pygame 精灵精灵组
其实相当于用类封装数据和方法,组相当于用类将精灵再封装一次,这样修改组属性,整个组内的精灵均做相应的改变. 一条鱼不停在图中移动的例子. 用的图 源码: import pygame pygame.in ...
- pygame精灵组有哪些方法_pygame怎样实现精灵的行走及二段跳
pygame制作游戏人物精灵的行走及二段跳实现方法 不得不承认<Python游戏编程入门>这本书翻译.排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里. 先是素材: 背景 ...
- Pygame精灵和碰撞检测
在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义. 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具.人物.场景装饰等,它们都 ...
- pygame精灵组有哪些方法_小精灵科学室-如何在活动中提高幼儿的探究能力和科学探究活动?...
小精灵幼儿科学发现室 幼儿科学教育的宗旨,幼儿科学活动的内容. 幼儿为什么要进行科学活动?科学活动的内容都有哪些?科学活动的理念是什么?如何开展科学活动的实施? 幼儿科学教育的宗旨:幼儿科学教育是指幼 ...
- 使用 Python 和 Pygame 构建小行星游戏
原文地址:https://realpython.com/asteroids-game-python/ 教程的电子文档:下载 模块pygame的官方网址:https://www.pygame.org/d ...
- python精灵和精灵组_Pygame精灵和精灵组
Pygame精灵和精灵组 Pygame 提供了两个类 pygame.sprite.Sprite -- 存储 图像数据 image 和 位置 rect 的 对象 pygame.sprite.Group ...
最新文章
- TinyML设备设计的Arm内核
- UVa 164 - String Computer
- Redis Cluster 原理你了解不?
- LeetCode5377. 将二进制表示减到1的步骤数
- C/C++ 回调函数是什么?Intel Realsense里的回调(callback)是什么?
- 2014 Multi-University Training Contest 1 Summary By Luke
- visio2013跨线问题
- java 数据排序需求分析_java 实现数组全排序
- 浅谈mysql的子查询
- 基于D3.js实现分类多标签的Tree型结构可视化
- JDK源码(11)-Long、Short
- python之堡垒机(第九天)
- PMP项目管理认证体系
- android画布_Android画布
- 阶段3 2.Spring_07.银行转账案例_4 编写事务管理工具类并分析连接和线程解绑
- Python3 高级用法
- MATLAB曲线拟合函数
- 常用编码:Shift_JIS, GBK,EUCKR,Big5,UTF8,CP1252
- python文本自动伪原创_手把手教你使用python制作伪原创工具
- python re模块的(...),group(),groups()