转载请注明:@小五义 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的距形,具体代码如下:

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

这里逐句进行一下分析,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大小的红色距形,完整代码如下:

#小五义 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()

(2)做一个精灵,显示内容为某一图片,这里以前面用过的小车图片为例,代码如下:

#小五义 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()

这段代码与(1)的不同之处在于self.image定义为pygame.image.load(filename),用来显示filename文件,本代码使用了ok1.jpg文件,并定义了小车右底角的显示位置是[150,100]。

三、学习精灵组
(1)使用精灵在屏幕上放多个图像,这种方法没用利用精灵组的概念,而是利用了list来生成每一个精灵。Cargroup用来存储不同位置的Car,screen.blit(carlist.image,carlist.rect)逐个显示每一个精灵。具体见代码:

#小五义 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()

具体效果见图:

(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 清空
同样还是上面的这个例子,这里用精灵组来实现。

#小五义 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()

两个例子都是在[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]之间的值作为速度让小车从下向上运动,并且当到达顶部时,再从底部出现。代码如下:

#小五义 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()

(2)可以通过左右键控制三辆小车的左右移动,按左键向左移动,当到达最左边时,不再移动,按右键向右移动,当到达最右边时,不再移动。具体代码如下:

#小五义 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学习笔记(5)——精灵相关推荐

  1. 【Pygame 学习笔记】8.精灵

    术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...

  2. Pygame学习笔记 4 —— 时间与运动

        还记得我们在之前的程序中如何让兔子动起来的吗,没错,使用event模块检测键盘事件,改变绘图的坐标,画面刷新后兔子就移动了.接下来我们细说如何精确控制时间和运动. 主要内容: pygame的时 ...

  3. Pygame学习笔记 6 —— 3D游戏

        pygame是是上世纪的产品,虽然不适合最3D游戏,但我可以使用pygame来绘制简单的3D图形,就像在白纸上画立体图形一样. 主要内容: 视觉上的远近.3D空间.绘制一个空间图形 一.视觉上 ...

  4. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  5. Python可视化物理随机过程---pygame学习笔记2

    Python可视化物理随机过程-pygame学习笔记2 文章目录 Python可视化物理随机过程---pygame学习笔记2 一.扩散现象的简单的介绍 二.代码实现 三.运行代码的效果展示 四.总结 ...

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

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

  7. pygame 学习笔记(7)添加一个精灵:坦克的移动和旋转

    本文内容 精灵 类的使用 Rect 类的使用 实现一个坦克的移动和旋转 效果演示 添加一个静态坦克 我们已经知道如何创建一个游戏窗口,并设置背景图片,还让游戏程序可以对键盘和鼠标进行响应,接着我们需要 ...

  8. Pygame学习笔记6:使用Pygame精灵以及Escape the Dragon

    上一章介绍了位图编程的相关内容,这一章就开始实现动画操作,那么主要就是要来了解pygame.sprite模块. 在pygame.sprite模块中,有一个名为Sprite的类,我们需要对其进行扩展使其 ...

  9. pygame学习笔记——检测鼠标碰到、点击图片

    一.碰到效果实现思路 1.坐标检测 时刻检测鼠标的坐标,有没有移到目标图片的坐标范围内,此方法无法准确描述不规则图像的坐标范围. 2.精灵碰撞检测 创建一个鼠标精灵类,创建鼠标对象,一直跟着鼠标移动, ...

最新文章

  1. 北大邮箱收件服务器,北京大学微电子学研究院邮件系统
  2. Web前端技巧分享:教你用GD库生成验证码
  3. 2019年美国大学生数学建模竞赛(MCM/ICM) E题解题思路
  4. Actor生命周期理解
  5. jwt重放攻击_4个点搞懂JWT、JWS、JWE
  6. 微信深色模式最大的槽点终于被干掉了,这一次安卓用户先享受!
  7. java内部类为什么使用很少_Java内部类你真的会吗?
  8. 开课吧Java课堂:如何通过接口引用实现接口?
  9. Java里线程的隔离方式_线程隔离浅析
  10. H5视频会议,直播,通话,教学,支持Webrtc、rtmp、sip、rtsp转协议、IPCAM、白板、桌面共享、免插件、web全平台、视频融合系统研发笔记。...
  11. delphi 域名解析IP 域名转为IP地址
  12. 软件测试之测试用例的设计
  13. 电子书产品日趋丰富,科大讯飞智能办公本仍是理想之选
  14. 机器学习概述和特征工程
  15. 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 Week10 20165233
  16. 从携程瘫痪事件看运维的85条军规
  17. 数组以及字符串的常用方法
  18. 新浪微博 QQ登录 登陆授权 V1.0
  19. 数据库设计之学生选课系统
  20. Windows系统如何滑动关机?1行代码就能实现滑动关机!(超简单!!!!!)

热门文章

  1. server新手引导 sql_史上最详细SQL Server 2008安装步骤图解新手教程
  2. 关于linux遭受挖矿病毒,伪装为trace
  3. 字符串算法 金策_OI ACM 课件收集整理
  4. 图像映射——计算机视觉
  5. linux编译安装jpeg,Linux下jpeglib库的安装详解
  6. OSS来存储文件 和 自己搭建文件服务器
  7. discuz php接口文档,Discuz二次开发技术文档
  8. Android集成开发工具——Android Studio
  9. excel中的抽奖程序
  10. 西安交大软件保研总结(中游偏下水平)