c# 怎样从bitmap初始化image类_使用Sprite实现移动动画(Pygame中的精灵类)

0c55e3f807d8afe1542315ae1420e870.png

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

而这张图片,一共有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
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
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值