[游戏制作学习]精灵动画类的实现--基于python3.7和pygame

[游戏制作学习]精灵动画类的实现--基于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列

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值