![0c55e3f807d8afe1542315ae1420e870.png](https://i-blog.csdnimg.cn/blog_migrate/f0e7e00251e945532cd0dc831c298310.jpeg)
pygame.sprite.Sprite就是Pygame里面用来实现精灵的一个类,使用时,并不需要对它实例化,只需要继承他,然后按需写出自己的类就好了,因此非常简单实用。
什么是精灵?
精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame绘制函数绘制的图像,也可以是原来就有的图像文件。
详细的使用方法,我们可以参考文档: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.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分别表示上下左右。
根据这些基础功能,我们开始新建一个GameSprite类:
import
init初始化方法:
接下来要做的事情是,让角色在上下左右移动时,切换不同的造型。(图片来源于网络,图侵删)
![ba7e840694d0a95d44664285e1105e29.png](https://i-blog.csdnimg.cn/blog_migrate/2b141ff6cc1af9d933ecfcaa1af3f197.png)
而这张图片,一共有16个造型,为了让GameSprite能够适配更多的角色,我们在初始化时,加入图片文件名和造型数量两个参数:
import pygame
class GameSprite(pygame.sprite.Sprite):
def __init__ (self, filename, frames = 1): # 造型frames默认为1
pygame.sprite.Sprite.__init__(self)
我们通过image.load加载整个图片:
img
由于角色在移动时,图片是不停在重新绘制的,所以我们把这个图片平均分成16张小图片,并保存在列表images中。
目前我们设置默认造型的长宽:
self.original_imgwidth = image.get_width() // frames # 整除造型数,平均分图片
self.original_height = image.get_height()
frame_surface = pygame.Surface([self.original_width, self.original_height]) # 设置精灵矩形
接下来,是通过循环,把图片分割成多个精灵矩形,并且保存在队列中,下次使用通过队列的排序进行轮换显示,而分割过程如下图,通过设置图片x坐标,进行分割。
![7ebbc38444856b41ba879c47e832e344.png](https://i-blog.csdnimg.cn/blog_migrate/0d48e02dedf9dd8a8677411b00c72ca6.jpeg)
x=0 # 初始坐标设置为0
for frame_no in range(frames):
frame_surface = pygame.Surface([self.original_width, self.original_height])
frame_surface.blit(image,[x,0])
self.images.append(frame_surface.copy()) # 注意这里需要用到Surface的copy方法才可以有效保存精灵矩形
x -= self.original_width # 每一次减去一个造型的矩形固定宽度
初始化方法中,设置基础配置:
self
移动move方法:
以角色的中心点设置move方法:
def move(self, pos_X, pos_Y):
self.rect.center = [pos_X,pos_Y]
添加切换图片change_image方法:
change_image方法,根据传入的index值去设置当前显示的造型图片。
def change_image(self, index):
self.current_index = index
self.image = self.images[index]
接下来设置坐标值,也就是新的造型坐标设置为当前造型的坐标位置:
oldcenter = self.rect.center
self.rect = self.image.get_rect()
self.rect.center = oldcenter
整个精灵类看起来是这样的:
import pygame
class GameSprite(pygame.sprite.Sprite):
def __init__ (self, filename, frames = 1)
pygame.sprite.Sprite.__init__(self)
self.images = []
img = pygame.image.load(filename)
self.original_width = img.get_width() // frames
self.original_height = img.get_height()
frame_surface = pygame.Surface([self.original_width, self.original_height])
x = 0
for frame_no in range(frames):
frame_surface = pygame.Surface([self.original_width, self.original_height])
frame_surface.blit(img, [x,0])
self.images.append(frame_surface.copy())
x -= self.original_width
self.image = self.images[0]
self.current_index = 0
self.rect=self.image.get_rect()
def move(self, pos_X, pos_Y):
self.rect.center = [pos_X, pos_Y]
def change_image(self, index):
self.current_index = index
self.image = self.images[index]
oldcenter = self.rect.center
self.rect = self.image.get_rect()
self.rect.center = oldcenter