据说在任天堂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])
三、建立一个简单的精灵
所有精灵在建立时都是从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大小的红色距形,完整代码如下:
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()
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_position self.rect.bottomright=initial_position print self.rect.right screen=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)使用精灵在屏幕上放多个图像,这种方法没用利用精灵组的概念,而是利用了list来生成每一个精灵。Cargroup用来存储不同位置的Car,screen.blit(carlist.image,carlist.rect)逐个显示每一个精灵。具体见代码:
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 清空
同样还是上面的这个例子,这里用精灵组来实现。
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()
四、动画
利用精灵组做动画会显得比较方便,这里我们首先让上面的三辆小车运动起来。
(1)三辆小车以不同的速度前行,利用random.choice随机生成[-10,-1]之间的值作为速度让小车从下向上运动,并且当到达顶部时,再从底部出现。代码如下:
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_position self.speed=speed def 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)可以通过左右键控制三辆小车的左右移动,按左键向左移动,当到达最左边时,不再移动,按右键向右移动,当到达最右边时,不再移动。具体代码如下:
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_position self.speed=speed def move(self): self.rect=self.rect.move(self.speed) if self.rect.bottom < 0: self.rect.top=480 def moveleft(self): self.rect.left=self.rect.left-10 if self.rect.left<0: self.rect.left=0 def moveright(self): self.rect.right=self.rect.right+10 if 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学习笔记(6):完成一个简单的游戏,包括了pygame学习笔记(6):完成一个简单的游戏的使用技巧和注意事项,需要的朋友参考一下 学了这么长时间的Pygame,一直想写个游戏实战一下。看起来很简单的游戏,写其来怎么这么难。最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读。后来,要想写一个帮助记忆的挖宝箱的游戏,结果也没完成。唯一
本文向大家介绍pygame学习笔记(4):声音控制,包括了pygame学习笔记(4):声音控制的使用技巧和注意事项,需要的朋友参考一下 pygame.mixer是一个用来处理声音的模块,其含义为“混音器”。游戏中对声音的处理一般包括制造声音和播放声音两部分,这里仅学习了播放声音部分。 1、pygame.mixer启动与初始化 pygame.mixer.init():mixer的初始化。程序中,使用
本文向大家介绍MongoDB 学习笔记,包括了MongoDB 学习笔记的使用技巧和注意事项,需要的朋友参考一下 1、配置:mongod --dbpath=D:\MongoDB\data mongo 2、基本的增删查改 find() update()-- 整体更新,局部更新。 修改器: $inc db.person.update({"age":23},{$inc:{"salary":1000}})
本文向大家介绍cmake 学习笔记,包括了cmake 学习笔记的使用技巧和注意事项,需要的朋友参考一下 最近接触到一些工程上的代码,都是用cmake来编译的,每次看着CMakeLists.txt 就各种懵逼,决定从0 开始学习 1 set 输出 hello 其实并不是单单输出hello,还有很多其他信息,会生成很多文件 files 2 CMAKE_C(XX)_FLAGS 变量 CMAKE_C_FL
TensorFlow安装 初识Tensorboard SKflow 觉得我的文章对您有帮助的话,就给个star吧~ 土豪可以打赏支持,一分也是爱
Copyright © 2004,2005,2006 本文遵从GNU 的自由文档许可证(Free Document License)的条款,欢迎转载、修改、散布。 发布时间:2004年11月16日 最近更新:2006年06月08日,增加安全策略。 Abstract Debian 是 Linux 发行版当中最自由的一种。由位于世界各地上千名的自愿者不断开发和维护。它不属于任何的商业公司,完全由开源社