[游戏制作学习]精灵动画类的实现--基于python3.7和pygame
#代码参考《python游戏编程入门》
我们的代码对pygame自带的精灵类进行继承实现,这样可以少些不少代码,而且可以获得精灵组的支持
首先是初始化精灵序列图:
def __init__(self,target): #初始化
pygame.sprite.Sprite.__init__(self) #对精灵类进行继承
self.master_image = None #图像
self.frame = 0 #当前序列编号
self.old_frame = -1 #上一个序列编号
self.frame_width = 1 #单个图宽度
self.frame_height = 1 #高度
self.first_frame = 0 #第一个精灵序列图编号
self.last_frame = 0 #最后一个
self.columns = 1 #列数
self.last_time = 0 #最后一次的时间
很好理解的位置函数:
def _getx(self):
return self.rect.x
def _setx(self,v):
self.rect.x=v
X=property(_getx,_setx)
def _gety(self):
return self.rect.y
def _sety(self,v):
self.rect.y=v
Y=property(_gety,_sety)
def _getpos(self):
return self.rect.topleft
def _setpos(self,v):
self.rect.topleft=v
position=property(_getpos,_setpos)
加载图像函数:
def load(self,filename,width,height,columns):
#保留透明通道的载入图像
self.master_image=pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = Rect(0,0,width,height)
self.columns = columns
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width)*(rect.height // height)-1
#计算最后序列图的编号
绘制函数:
def update(self,current_time,rate=30):
if current_time > self.last_time + rate: #如果可以更新
self.frame += 1
if self.frame > self.last_frame: #播放到最后一个序列图后重置
self.frame = self.first_frame
self.last_time = current_time
if self.frame != self.old_frame:
#计算单个图像宽度
frame_x = (self.frame % self.columns)*self.frame_width
#计算单个图像高度
frame_y = (self.frame // self.columns)*self.frame_height
rect = pygame.Rect(frame_x,frame_y,self.frame_width,self.frame_height)
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
简单精灵类全部代码:
class my_sprite(pygame.sprite.Sprite):
def __init__(self,target): #初始化
pygame.sprite.Sprite.__init__(self) #对精灵类进行继承
self.master_image = None #图像
self.frame = 0 #当前序列编号
self.old_frame = -1 #上一个序列编号
self.frame_width = 1 #单个图宽度
self.frame_height = 1 #高度
self.first_frame = 0 #第一个精灵序列图编号
self.last_frame = 0 #最后一个
self.columns = 1 #列数
self.last_time = 0 #最后一次的时间
def _getx(self):
return self.rect.x
def _setx(self,v):
self.rect.x=v
X=property(_getx,_setx)
def _gety(self):
return self.rect.y
def _sety(self,v):
self.rect.y=v
Y=property(_gety,_sety)
def _getpos(self):
return self.rect.topleft
def _setpos(self,v):
self.rect.topleft=v
position=property(_getpos,_setpos)
def load(self,filename,width,height,columns):
#保留透明通道的载入图像
self.master_image=pygame.image.load(filename).convert_alpha()
self.frame_width = width
self.frame_height = height
self.rect = Rect(0,0,width,height)
self.columns = columns
rect = self.master_image.get_rect()
self.last_frame = (rect.width // width)*(rect.height // height)-1
#计算最后序列图的编号
def update(self,current_time,rate=30):
if current_time > self.last_time + rate: #如果可以更新
self.frame += 1
if self.frame > self.last_frame: #播放到最后一个序列图后重置
self.frame = self.first_frame
self.last_time = current_time
if self.frame != self.old_frame:
#计算单个图像宽度
frame_x = (self.frame % self.columns)*self.frame_width
#计算单个图像高度
frame_y = (self.frame // self.columns)*self.frame_height
rect = pygame.Rect(frame_x,frame_y,self.frame_width,self.frame_height)
self.image = self.master_image.subsurface(rect)
self.old_frame = self.frame
再分享一个我自己画的精灵序列图 太丑了:
高度宽度都是64,4列