0x01 [游戏制作]精灵动画类的实现--基于python3.7和pygame
Posted charainland
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0x01 [游戏制作]精灵动画类的实现--基于python3.7和pygame相关的知识,希望对你有一定的参考价值。
#代码参考《python游戏编程入门》
我们的代码对pygame自带的精灵类进行继承实现,这样可以少些不少代码,而且可以获得精灵组的支持
首先是初始化精灵序列图:
1 def __init__(self,target): #初始化 2 pygame.sprite.Sprite.__init__(self) #对精灵类进行继承 3 self.master_image = None #图像 4 self.frame = 0 #当前序列编号 5 self.old_frame = -1 #上一个序列编号 6 self.frame_width = 1 #单个图宽度 7 self.frame_height = 1 #高度 8 self.first_frame = 0 #第一个精灵序列图编号 9 self.last_frame = 0 #最后一个 10 self.columns = 1 #列数 11 self.last_time = 0 #最后一次的时间
很好理解的位置函数:
1 def _getx(self): 2 return self.rect.x 3 def _setx(self,v): 4 self.rect.x=v 5 X=property(_getx,_setx) 6 7 def _gety(self): 8 return self.rect.y 9 def _sety(self,v): 10 self.rect.y=v 11 Y=property(_gety,_sety) 12 13 def _getpos(self): 14 return self.rect.topleft 15 def _setpos(self,v): 16 self.rect.topleft=v 17 position=property(_getpos,_setpos)
加载图像函数:
1 def load(self,filename,width,height,columns): 2 #保留透明通道的载入图像 3 self.master_image=pygame.image.load(filename).convert_alpha() 4 self.frame_width = width 5 self.frame_height = height 6 self.rect = Rect(0,0,width,height) 7 self.columns = columns 8 rect = self.master_image.get_rect() 9 self.last_frame = (rect.width // width)*(rect.height // height)-1 10 #计算最后序列图的编号
绘制函数:
1 def update(self,current_time,rate=30): 2 if current_time > self.last_time + rate: #如果可以更新 3 self.frame += 1 4 if self.frame > self.last_frame: #播放到最后一个序列图后重置 5 self.frame = self.first_frame 6 self.last_time = current_time 7 if self.frame != self.old_frame: 8 #计算单个图像宽度 9 frame_x = (self.frame % self.columns)*self.frame_width 10 #计算单个图像高度 11 frame_y = (self.frame // self.columns)*self.frame_height 12 rect = pygame.Rect(frame_x,frame_y,self.frame_width,self.frame_height) 13 self.image = self.master_image.subsurface(rect) 14 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列
以上是关于0x01 [游戏制作]精灵动画类的实现--基于python3.7和pygame的主要内容,如果未能解决你的问题,请参考以下文章
error bad argument #1 to draw (drawable expected, got table),试图为主角制作一个精灵动画