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

  1. class Temp(pygame.sprite.Sprite):
  2. def __init__(self,color,initial_position):
  3. pygame.sprite.Sprite.__init__(self)
  4. self.image = pygame.Surface([30,30])
  5. self.image.fill(color)
  6. self.rect=self.image.get_rect()
  7. 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大小的红色距形,完整代码如下:

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. pygame.init()
  4. class Temp(pygame.sprite.Sprite):
  5. def __init__(self,color,initial_position):
  6. pygame.sprite.Sprite.__init__(self)
  7. self.image = pygame.Surface([30,30])
  8. self.image.fill(color)
  9. self.rect=self.image.get_rect()
  10. self.rect.topleft=initial_position
  11. screen=pygame.display.set_mode([640,480])
  12. screen.fill([255,255,255])
  13. b=Temp([255,0,0],[50,100])
  14. screen.blit(b.image,b.rect)
  15. pygame.display.update()
  16. while True:
  17. for event in pygame.event.get():
  18. if event.type==pygame.QUIT:
  19. sys.exit()

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

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. pygame.init()
  4. class Car(pygame.sprite.Sprite):
  5. def __init__(self,filename,initial_position):
  6. pygame.sprite.Sprite.__init__(self)
  7. self.image=pygame.image.load(filename)
  8. self.rect=self.image.get_rect()
  9. #self.rect.topleft=initial_position
  10. self.rect.bottomright=initial_position
  11. print self.rect.right
  12.  
  13. screen=pygame.display.set_mode([640,480])
  14. screen.fill([255,255,255])
  15. fi='ok1.jpg'
  16. b=Car(fi,[150,100])
  17. screen.blit(b.image,b.rect)
  18. pygame.display.update()
  19. while True:
  20. for event in pygame.event.get():
  21. if event.type==pygame.QUIT:
  22. sys.exit()

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

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

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. pygame.init()
  4. class Car(pygame.sprite.Sprite):
  5. def __init__(self,filename,initial_position):
  6. pygame.sprite.Sprite.__init__(self)
  7. self.image=pygame.image.load(filename)
  8. self.rect=self.image.get_rect()
  9. self.rect.bottomright=initial_position
  10.  
  11. screen=pygame.display.set_mode([640,480])
  12. screen.fill([255,255,255])
  13. fi='ok1.jpg'
  14. locationgroup=([150,200],[350,360],[250,280])
  15. Cargroup=[]
  16. for lo in locationgroup:
  17. Cargroup.append(Car(fi,lo))
  18. for carlist in Cargroup:
  19. screen.blit(carlist.image,carlist.rect)
  20. pygame.display.update()
  21. while True:
  22. for event in pygame.event.get():
  23. if event.type==pygame.QUIT:
  24. 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 清空
同样还是上面的这个例子,这里用精灵组来实现。

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. pygame.init()
  4. class Car(pygame.sprite.Sprite):
  5. def __init__(self,filename,initial_position):
  6. pygame.sprite.Sprite.__init__(self)
  7. self.image=pygame.image.load(filename)
  8. self.rect=self.image.get_rect()
  9. self.rect.bottomright=initial_position
  10. screen=pygame.display.set_mode([640,480])
  11. screen.fill([255,255,255])
  12. fi='ok1.jpg'
  13. locationgroup=([150,200],[350,360],[250,280])
  14. Cargroup=pygame.sprite.Group()
  15. for lo in locationgroup:
  16. Cargroup.add(Car(fi,lo))
  17.  
  18. for carlist in Cargroup.sprites():
  19. screen.blit(carlist.image,carlist.rect)
  20. pygame.display.update()
  21. while True:
  22. for event in pygame.event.get():
  23. if event.type==pygame.QUIT:
  24. 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]之间的值作为速度让小车从下向上运动,并且当到达顶部时,再从底部出现。代码如下:

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. from random import *
  4. pygame.init()
  5. class Car(pygame.sprite.Sprite):
  6. def __init__(self,filename,initial_position,speed):
  7. pygame.sprite.Sprite.__init__(self)
  8. self.image=pygame.image.load(filename)
  9. self.rect=self.image.get_rect()
  10. self.rect.topleft=initial_position
  11. self.speed=speed
  12. def move(self):
  13. self.rect=self.rect.move(self.speed)
  14. if self.rect.bottom < 0: #当小车底部到达窗口顶部时,让小车从下面出来
  15. self.rect.top=480
  16. screen=pygame.display.set_mode([640,480])
  17. screen.fill([255,255,255])
  18. fi='ok1.jpg'
  19. locationgroup=([150,200],[350,300],[250,200])
  20. Cargroup=pygame.sprite.Group()
  21. for lo in locationgroup:
  22. speed=[0,choice([-10,-1])]
  23. Cargroup.add(Car(fi,lo,speed))
  24.  
  25. while True:
  26. for event in pygame.event.get():
  27. if event.type==pygame.QUIT:
  28. sys.exit()
  29. pygame.time.delay(20)
  30. screen.fill([255,255,255])
  31. for carlist in Cargroup.sprites():
  32. carlist.move()
  33. screen.blit(carlist.image,carlist.rect)
  34. pygame.display.update()

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

  1. #小五义 http://www.cnblogs.com/xiaowuyi
  2. import pygame,sys
  3. from random import *
  4. pygame.init()
  5. class Car(pygame.sprite.Sprite):
  6. def __init__(self,filename,initial_position,speed):
  7. pygame.sprite.Sprite.__init__(self)
  8. self.image=pygame.image.load(filename)
  9. self.rect=self.image.get_rect()
  10. self.rect.topleft=initial_position
  11. self.speed=speed
  12. def move(self):
  13. self.rect=self.rect.move(self.speed)
  14. if self.rect.bottom < 0:
  15. self.rect.top=480
  16. def moveleft(self):
  17. self.rect.left=self.rect.left-10
  18. if self.rect.left<0:
  19. self.rect.left=0
  20. def moveright(self):
  21. self.rect.right=self.rect.right+10
  22. if self.rect.right>640:
  23. self.rect.right=640
  24. screen=pygame.display.set_mode([640,480])
  25. screen.fill([255,255,255])
  26. fi='ok1.jpg'
  27. locationgroup=([150,200],[350,300],[250,200])
  28. Cargroup=pygame.sprite.Group()
  29. for lo in locationgroup:
  30. speed=[0,choice([-10,-1])]
  31. Cargroup.add(Car(fi,lo,speed))
  32.  
  33. while True:
  34. for event in pygame.event.get():
  35. if event.type==pygame.QUIT:
  36. sys.exit()
  37. elif event.type == pygame.KEYDOWN:
  38. if event.key==pygame.K_LEFT:
  39. for carlist in Cargroup.sprites():
  40. carlist.moveleft()
  41. screen.blit(carlist.image,carlist.rect)
  42. if event.key==pygame.K_RIGHT:
  43. for carlist in Cargroup.sprites():
  44. carlist.moveright()
  45. screen.blit(carlist.image,carlist.rect)
  46. pygame.time.delay(20)
  47. screen.fill([255,255,255])
  48. for carlist in Cargroup.sprites():
  49. carlist.move()
  50. screen.blit(carlist.image,carlist.rect)
  51. pygame.display.update()

pygame学习笔记(5)——精灵的更多相关文章

  1. pygame学习笔记(3)——时间、事件、文字

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 1.运动速率    上节中,实现了一辆汽车在马路上由下到上行驶,并使用了pygame.time.delay(200 ...

  2. PyGame学习笔记之壹

    新建窗口 代码 '''PyGame学习笔记之壹''' import pygame # 引入 PyGame 库 pygame.init() # PyGame 库初始化 screen = pygame.d ...

  3. pygame学习笔记(4)——声音

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi pygame.mixer是一个用来处理声音的模块,其含义为“混音器”.游戏中对声音的处理一般包括制造声音和播放声音 ...

  4. pygame学习笔记(1)——安装及矩形、圆型画图

    pygame是一个设计用来开发游戏的python模块,其实说白了和time.os.sys都是一样的东东.今天开始正式学习pygame,下载地址:www.pygame.org.下载后安装完成即可,在py ...

  5. pygame学习笔记

    pygame参考文档pdf版:pygame API html版 pygame API 石头剪子布的简单小游戏,待改进的地方,自适应大小.感兴趣的小伙伴可以依据get_surface()返回值(即当前窗 ...

  6. pygame学习笔记(6)——一个超级简单的游戏

    转载请注明:@小五义  http://www.cnblogs.com/xiaowuyi 学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块 ...

  7. pygame学习笔记(2)——从画点到动画

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 1.单个像素(画点)利用pygame画点主要有三种方法:方法一:画长宽为1个像素的正方形 #@小五义 http:/ ...

  8. PYGAME学习笔记_01

    01_使用PYGAME创建图形窗口 1.1_游戏的初始化和退出 pygame.init() 写入并初始化所有PYGAME模块,使用其他模块之前,必须先调用init方法 pygame.quit() 卸载 ...

  9. 转 pygame学习笔记(1)——安装及矩形、圆型画图

    http://www.cnblogs.com/xiaowuyi/archive/2012/06/06/2538921.html

随机推荐

  1. 18-[JavaScript]-函数,Object对象,定时器,正则表达式

    1.函数创建 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  2. Python day1 ---python基础1.1

    1.模块初识2..pyc是个什么鬼?3.数据类型初识 4.数据运算5.入门知识拾遗 1.模块初识 sys模块 import sys print(sys.path) #打印环境变量 'D:\\Pycha ...

  3. 【项目管理】 使用IntelliJ IDEA 将项目发布(提交)到GitLab

    https://blog.csdn.net/zsq520520/article/details/51004721 gitlab地址: http://192.168.1.81:200   idea项目p ...

  4. maven的pom文件报错: must be "pom" but is "jar"

    问题 Project build error: Invalid packaging for parent POM com.test:hello-parent:0.0.1-SNAPSHOT (E:\ec ...

  5. 巧用 Python 找工作(资料在文末)

    前言 近年来 Python 之火大家都有感而知,那亲们知道北京的 Python 开发岗位.运维开发岗位招聘地域都是如何分布的吗?薪水如何?是否有前景等等,这些数据呢直接通过招聘信息来了解到企业用人是最 ...

  6. $(document).ready(function() 与window.onload

    $(document).ready(function() window.onload 事件是页面完全加载完的时候执行$(function(){ }) 是等页面上的标签加载完了就执行 页面加载完成后开始 ...

  7. 安装php xdebug调试工具及性能分析工具webgrind for windows

    安装php xdebug调试工具及性能分析工具webgrind for windows 第一步:查看php版本等信息 phpinfo(); 上面是 x86 NTS VC14 第二步: 下载xdebug ...

  8. 【HDU】3555【Bomb】

    题目链接 此题题意就是给你T个n,找出n以内的包含49的数的个数. 很裸的一题数位dp. 直接dp包含49的数的个数有点麻烦,所以我先算出不包含49的数的个数,然后用n+1来减(因为计算不包含49的数 ...

  9. PHP核心技术——异常和错误处理

    PHP只有手动抛出异常后才能捕获异常 $a = null; try { $a = 5/0; echo $a,PHP_EOL; } catch (exception $e) { $e -> get ...

  10. hadoop组件概念理解

    一.HADOOP 二.HIVE 三.SQOOP 1.来由和作用 sqoop由一些封装好的MR程序的jar包构成,后演变成框架,但sqoop只有map任务没有reduce任务. 用于 hdfs.hive ...