【Python游戏编程入门笔记1】pygame.sprite.Sprite类的几个关键函数或者变量

文章介绍了如何利用Pygame的Sprite类创建和加载一系列png图片,通过设置帧宽度、高度和列数来实现动画效果。关键函数包括`load`和`update`,前者用于加载和处理图片,后者用于更新帧并控制动画播放速度。在游戏主循环中,通过`pygame.sprite.Group().update()`来更新所有精灵的状态,并使用`draw`方法绘制到屏幕上。
摘要由CSDN通过智能技术生成

pygame.sprite.Sprite类主要是加载一系列png图片,然后按照一定的时间间隔进行显示,这里记录几个关键点

一系列png图片的加载

Sprite类是按照从一个大的png图片里,按照等尺寸大小将这个大的png图片裁剪成多个小的png图片,这些多个小的png图片就组成了一系列png图片序列,这些图片序列逐帧加载就变成了动画了。
在这里插入图片描述
类似于上面这个png,其尺寸是780乘以300像素的。总共6个子图片,每个子图片的大小是260乘以150,sprite类的load函数就应该这样写

#create the sprite
dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
group = pygame.sprite.Group()
group.add(dragon)

load函数的最后一个参数3,说明这个图片是3列的

下面我们具体来看一下,load和update函数的代码,找出来Sprite类的几个关键变量

class MySprite(pygame.sprite.Sprite):
    def __init__(self, target):
        pygame.sprite.Sprite.__init__(self) #extend the base Sprite class
        self.target_surface = target
        self.image = None
        self.master_image = None
        self.rect = None
        self.topleft = 0,0
        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 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 = 0,0,width,height
        self.columns = columns
        #try to auto-calculate total frames
        rect = self.master_image.get_rect()
        self.last_frame = (rect.width // width) * (rect.height // height) - 1

    def update(self, current_time, rate=30):
        #update animation frame number
        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

        #build current frame only if it changed
        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 = ( frame_x, frame_y, self.frame_width, self.frame_height )
            self.image = self.master_image.subsurface(rect)
            self.old_frame = self.frame

子png图片提取和显示(具体屏幕上的显示位置)

self.master_image = pygame.image.load(filename).convert_alpha()

master_image变量指向加载图片的位置

frame_x = (self.frame % self.columns) * self.frame_width
frame_y = (self.frame // self.columns) * self.frame_height
rect = ( frame_x, frame_y, self.frame_width, self.frame_height )
self.image = self.master_image.subsurface(rect)

self.frame是子画面也就是帧的序号,从0开始,上面的代码中rect指定了特定序号帧的rect区域,其中self.frame_width, self.frame_height分别指的是子帧的宽和高,通过self.master_image.subsurface(rect)即可获得子帧的图片。

而sprite类的变量self.rect则是指定当前帧的屏幕显示位置,下面这个语句是从load函数中摘取出来的,初始显示位置从屏幕的左上角0,0处开始。

self.rect = 0,0,width,height

程序可以在游戏主循环中不断更新self.rect的位置,来达到不同的帧在不同位置移动的效果。

Sprite类的update函数

游戏主循环main loop通过调用update函数实现不同帧的连续加载以及控制每秒帧率FPS

说明:以上代码摘自 Python游戏编程入门的第七章SpriteAnimationDemo.py文件

pygame.sprite.Group()

游戏主循环main loop通过调用显式调用pygame.sprite.Group()的update函数来间接调用Sprite类的update函数

#initialize pygame
pygame.init()
screen = pygame.display.set_mode((800,600),0,32)
pygame.display.set_caption("Sprite Animation Demo")
font = pygame.font.Font(None, 18)
framerate = pygame.time.Clock()


#create the sprite
dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
group = pygame.sprite.Group()
group.add(dragon)


#main loop
while True:
    framerate.tick(30)
    ticks = pygame.time.get_ticks()

    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
    key = pygame.key.get_pressed()
    if key[pygame.K_ESCAPE]: sys.exit()
        
    screen.fill((0,0,100))

    group.update(ticks)
    group.draw(screen)

    print_text(font, 0, 0, "Sprite: " + str(dragon))


    pygame.display.update()
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值