pygame学习笔记(5):游戏精灵
据说在任天堂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的距形,具体代码如下:
classTemp(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大小的红色距形,完整代码如下:
importpygame,sys pygame.init() classTemp(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() whileTrue: foreventinpygame.event.get(): ifevent.type==pygame.QUIT: sys.exit()
(2)做一个精灵,显示内容为某一图片,这里以前面用过的小车图片为例,代码如下:
importpygame,sys pygame.init() classCar(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 printself.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() whileTrue: foreventinpygame.event.get(): ifevent.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)逐个显示每一个精灵。具体见代码:
importpygame,sys pygame.init() classCar(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=[] forloinlocationgroup: Cargroup.append(Car(fi,lo)) forcarlistinCargroup: screen.blit(carlist.image,carlist.rect) pygame.display.update() whileTrue: foreventinpygame.event.get(): ifevent.type==pygame.QUIT: sys.exit()