《pygame游戏开发实战指南》第八节 Sprite类和Group类

news2024/9/20 9:02:06

Sprite(精灵)是游戏中一个非常重要的概念。在游戏开发中,‌Sprite指的是一个可以移动、‌旋转或变换的二维图像,‌它负责管理游戏中的图像元素,‌使得开发者可以轻松地在游戏中创建各种动态效果和角色。‌pygame.sprite模块提供了Sprite类和Group类,两者关系密切,一般同时出现。Group其实就是Sprite的容器,可以让我们更加方便的管理各个Sprite对象。本节会详细介绍下这两个类。

项目代码下载地址: https://github.com/la-vie-est-belle/pygame_codes


8.1 Sprite

我们先来看下Sprite类的常见属性和函数。

image

image属性表示当前Sprite精灵显示的图像,该属性的值是Surface类型。


rect

rect属性表示当前Sprite精灵所在的矩形区域,该属性的值是Rect类型。

注:当自定义类继承Sprite类时,我们必须让自定义类拥有imagerect实例属性,属性名称也不能修改。请看下方代码片段。

class MySprite(pygame.sprite.Sprite):
    def __init__(self):
        super(MySprite, self).__init__()
        self.image = pygame.image.load('xxx.png')
        self.rect = self.image.get_rect()

update()

继承Sprite类后,我们可以重写这个函数,把Sprite对象的状态更新操作都放在这里。

注:Group类也有个update()函数,当某个Group对象调用了自己的update()函数时,就会触发所有被添加进来的Sprite对象的update()函数。


add(*groups)

将当前Spite对象添加到指定的Group对象中。一个Sprite对象可以同时被添加到多个Group对象中。


remove(*groups)

从指定的Group对象中删除当前Spite对象。


kill()

把当前Spite对象从所有的Group对象中删除。


alive()

判断当前Spite对象是否有被添加到任何一个Group对象中,有的话就返回True,否则返回False


groups()

返回一个添加了当前Spite对象的Group对象列表。


示例代码8-1演示了Sprite类的用法。

import sys
import pygame


class Dino(pygame.sprite.Sprite):               # 1
    def __init__(self):
        super(Dino, self).__init__()
        self.image = pygame.image.load('dino_start.png').convert_alpha()
        self.rect = self.image.get_rect(topleft=(80, 450))

        self.speed = 1

    def draw(self, surface):
        surface.blit(self.image, self.rect)

    def update(self):
        self.rect.x += self.speed
        if self.rect.right >= 1100 or self.rect.left <= 0:
            self.speed = -self.speed
            self.image = pygame.transform.flip(self.image, True, False)


def main():
    pygame.init()
    clock = pygame.time.Clock()                 # 2

    screen = pygame.display.set_mode((1100, 600))
    pygame.display.set_caption('Dino Runner')

    icon = pygame.image.load('icon.png')
    pygame.display.set_icon(icon)

    land = pygame.image.load('land.png').convert_alpha()
    land_rect = land.get_rect()
    land_rect.y = 520

    dino = Dino()                               # 3

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        screen.fill((255, 255, 255))
        screen.blit(land, land_rect)
        
        dino.draw(screen)                       # 4
        dino.update()

        pygame.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    main()

运行结果如下:
示例代码8-1运行结果

代码解释如下:
#1 定义一个Dino类,继承Sprite类,然后指定了必要的image属性和rect属性。speed属性表示小恐龙的移动速度。draw()函数是自定义的,在该函数中,我们让这个小恐龙显示在了传入的Surface对象上。我们还重写了update()函数,让小恐龙不断的向左或向右移动。pygame.transform.flip()函数用来翻转图片,其参数解释如下。

flip(surface, flip_x, flip_y)
  • surface: 要翻转的Surface对象。
  • flip_x: bool类型,是否水平翻转。
  • flip_y: bool类型,是否垂直翻转。

#2 通过创建一个Clock对象,‌开发者可以精确地控制游戏循环的速度,‌确保游戏在不同计算机上以相同的速度运行,‌从而提供一致的游戏体验。‌Clock对象的tick()函数可以用来设置游戏帧率,tick(60)就表示将游戏帧率设置为60帧。

#3 实例化一个Dino对象。

#4 调用draw()函数将小恐龙显示在屏幕上,调用update()方法更新小恐龙的状态。


8.2 Group

现在我们来看下Group类的常用函数。

sprites()

返回一个列表,其中包含所有被添加进来的Sprite对象。


copy()

复制当前Group对象,返回一个新的Group对象,这个Group对象包含所有的原始的Sprite对象。


add(*sprites)

添加任意数量的Sprite对象,已经添加过的无法再被添加。


remove(*sprites)

移除任意数量的Sprite对象。


has(*sprites)

判断是否包含某个或某些Sprite对象,是的话返回True


update()

会调用所有被添加进来的Sprite对象的update()函数。


draw(surface)

把所有Sprite对象绘制到指定的Surface对象上。该函数就是调用了Surface对象的blit()函数,并将Sprite对象的imagerect属性用作参数。


示例代码8-2演示了Group类的用法。

import sys
import pygame


class Dino(pygame.sprite.Sprite):
    def __init__(self):
        super(Dino, self).__init__()
        self.image = pygame.image.load('dino_start.png').convert_alpha()
        self.rect = self.image.get_rect(topleft=(80, 450))

        self.speed = 1

    def draw(self, surface):
        surface.blit(self.image, self.rect)

    def update(self):
        self.rect.x += self.speed
        if self.rect.right >= 1100 or self.rect.left <= 0:
            self.speed = -self.speed
            self.image = pygame.transform.flip(self.image, True, False)


class Bird(pygame.sprite.Sprite):               # 1
    def __init__(self, pos):
        super(Bird, self).__init__()
        self.image = pygame.image.load('bird.png').convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = pos

        self.speed = 1

    def update(self):
        self.rect.y += self.speed
        if self.rect.top >= 300 or self.rect.bottom <= 0:
            self.speed = -self.speed


def main():
    pygame.init()
    clock = pygame.time.Clock()

    screen = pygame.display.set_mode((1100, 600))
    pygame.display.set_caption('Dino Runner')

    icon = pygame.image.load('icon.png')
    pygame.display.set_icon(icon)

    land = pygame.image.load('land.png').convert_alpha()
    land_rect = land.get_rect()
    land_rect.y = 520

    dino = Dino()

    bird_group = pygame.sprite.Group()          # 2
    for i in range(5):
        bird = Bird((80+i*220, i*10))
        bird_group.add(bird)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        screen.fill((255, 255, 255))
        screen.blit(land, land_rect)

        dino.draw(screen)
        dino.update()

        bird_group.draw(screen)                 # 3
        bird_group.update()

        pygame.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    main()

运行结果如下:
示例代码8-2运行结果

代码解释如下:
#1 定义一个Bird类,继承Sprite类。这个Bird类在实例化的时候接收一个pos参数,用来指定图片的中心位置。

#2 实例化一个Group对象,并通过add()函数将5个Bird对象添加了进去。

#3 调用draw()函数将所有Bird对象绘制到屏幕上。调用update()函数更新所有Bird对象的状态。


8.3 小结

本节我们了解了Sprite类和Group类的用法以及两者之间的关系。使用这两个类,我们可以让游戏代码结构更加清晰易懂,方便修改。


如果你喜欢笔者的这部专栏,可以给笔者一些打赏,或者通过购买一些项目来支持作者,非常感谢!

微信支付   支付宝   微店

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention

分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention 文章目录 前言分类预测|基于鲸鱼优化-卷积-长短期记忆网络-注意力数据分类预测Matlab程序 WOA-CNN-LSTM-Attention 一、WOA-CNN-LSTM-Attention模型1. 鲸鱼优化算法&#xff0…

产品经理的具体职责有哪些?

产品经理作为产品团队的核心角色&#xff0c;负责从概念到市场发布的整个过程&#xff0c;确保产品能够满足用户需求&#xff0c;实现商业目标。其工作职责广泛且深入&#xff0c;涵盖了产品规划、设计、开发、运营、推广等多个方面。以下是详细的工作职责描述以及产品经理的核…

一文彻底搞懂Transformer - 注意力机制

Transformer 一、注意力机制 Seq2Seq 注意力机制目标 Attention模块的主要作用是确定在给定上下文中哪些嵌入向量与当前任务最相关&#xff0c;并据此更新或调整这些嵌入向量的表示。 Transformer注意力机制 注意力机制案例 注意力机制计算公式 生成Q、K、V向量&#xff1a;对…

智能升降晾衣架:NRK3301语音识别模块ic让家务变得更轻松

对于经常做家务的人来说&#xff0c;洗衣服和晾衣服是一件非常耗费体力和时间的任务。传统的晾衣架安装在了一个固定的高度&#xff0c;挂衣服和取衣服需要通过撑衣杆来晾取衣物&#xff0c;即便是电动升降的晾衣架&#xff0c;也需要人手动去操作&#xff0c;增加了工作量。然…

Vue 项目中导入文件时如何默认找寻该文件夹下的 index.vue 文件

文章目录 需求分析 需求 如下图&#xff0c;在Vue 项目中导入 frequencyChange 文件夹时如何默认找寻该文件夹下的 index.vue 文件 分析 确保项目结构和命名约定 首先&#xff0c;确保你的 Vue 单文件组件按照约定命名&#xff0c;例如&#xff1a; components/Example/inde…

Python酷库之旅-第三方库Pandas(080)

目录 一、用法精讲 331、pandas.Series.str.repeat方法 331-1、语法 331-2、参数 331-3、功能 331-4、返回值 331-5、说明 331-6、用法 331-6-1、数据准备 331-6-2、代码示例 331-6-3、结果输出 332、pandas.Series.str.replace方法 332-1、语法 332-2、参数 33…

【QT常用技术讲解】QTableView添加QCheckBox、QPushButton

前言 QT展示列表信息的时候通常用到列表&#xff08;比如用户信息、机构信息、设备信息等菜单&#xff09;&#xff0c;当需要对某列进行修改、删除操作时&#xff0c;就需要加入按钮&#xff08;QPushButton&#xff09;&#xff0c;当需要对多列进行右键菜单操作时&#xff0…

DjangoRF-15-分布式celery应用

前面我们同步实现了测试任务的执行&#xff0c;但是它有一个致命的问题。 实际项目测试任务耗时会非常长&#xff0c;而django框架的请求是有超时的&#xff0c;哪怕没有超时&#xff0c;这么做显然不妥。所以需要使 用异步任务的方式来执行测试任务。 发送一个执行任务的请求&…

沐风老师3DMAX纹理工具箱TexTools使用方法详解

DMAX纹理工具箱TexTools是一组工具,可帮助任何纹理艺术家完成UV和纹理相关任务。主要理念是将典型步骤简化为简单的上下文相关单击。 大多数功能仅在3dMax中处于editUVW模式时才起作用(展开UVW修改器,然后单击编辑按钮)。 【版本要求】 3dMax9及更高版本 【安装方法】 将…

EmbeddedBuilder_v1.4.1.23782 - 在工程中添加自己的C实现文件

文章目录 EmbeddedBuilder_v1.4.1.23782 - 在工程中添加自己的C实现文件概述笔记添加自己的文件夹在文件夹中建立新文件在文件夹中载入已经存在的文件修改工程编译时的包含路径和库路径添加包含路径添加实现路径 在main.c或其他实现中添加自己的头文件引用和自己的函数调用保存…

Seaborn库

目录 主要功能和特点 使用方法 实例应用 Seaborn库的最新版本有哪些新功能和改进&#xff1f; 如何在Seaborn中实现复杂的数据预处理步骤&#xff0c;例如数据清洗和转换&#xff1f; Seaborn与其他数据可视化库&#xff08;如Matplotlib、Plotly&#xff09;相比有哪些优…

【图像去雾系列】使用暗通道先验去雾算法对图像进行去雾处理

目录 一 暗通道先验去雾算法 1 雾形成机理-大气散射模型 2 暗通道先验的整体思想 二 实践 一 暗通道先验去雾算法 论文名称:Single Image Haze Removal Using Dark Channel Prior 论文地址:Single Image Haze Removal Using Dark Channel Prior | IEEE Journals & …

合合信息的OCR技术在智能文档处理方面有哪些具体的应用案例?

智能文档处理(IDP)是利用人工智能技术,自动从复杂的非结构化和半结构化文档中抽取关键数据,并将其转换成结构化数据的技术。能够自动识别、提取并结构化处理文档中的关键信息。这种技术通常基于自然语言处理&#xff08;NLP&#xff09;和计算机视觉等先进技术&#xff0c;可以…

【连续4届EI检索,SPIE 出版】第五届信号处理与计算机科学国际学术会议(SPCS 2024,8月23-25)

第五届信号处理与计算机科学国际学术会议&#xff08;SPCS 2024) 将于2024年8月23-25日在中国哈尔滨举行。会议主要围绕信号处理与计算机科学等研究领域展开讨论。 会议旨在为从事信号处理与计算机科学研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技…

如何使用Wireshake解密Wi-Fi QoS Data报文?

1. 使用Wireshake解密Wi-Fi数据报文 通常当Wi-Fi发生某些问题时&#xff0c;我们都会抓取Wi-Fi sniffer log&#xff0c;用以协助分析问题&#xff0c;但是如果Wi-Fi使用了加密&#xff0c;则我们无法从sniffer log中获取到IP数据的层级&#xff0c;因为在Wi-Fi报文中&#xf…

非专业人士的编程梦:低代码开发平台的崛起与挑战

文章目录 每日一句正能量前言技术概览基本概念主要特点市场现状适用性分析结论 效率与质量的权衡效率提升质量与安全的挑战企业应用开发中的利弊应对策略结论 挑战与机遇挑战机遇应对策略结论 后记 每日一句正能量 书读的越多而不加思考&#xff0c;你就会觉得你知道得很多&…

24/8/14算法笔记 复习_逻辑回归sigmoid

import numpy as np import matplotlib.pyplot as pltdef sigmoid(x):return 1/(1np.exp(-x))x np.linspace(-5,5,100) y sigmoid(x)plt.plot(x,y,colorgreen) #损失函数 from sklearn import datasets from sklearn.linear_model import LogisticRegression from mpl_toolki…

SpringBoot教程(二十一) | SpringBoot实现定时任务

SpringBoot教程&#xff08;二十一&#xff09; | SpringBoot实现定时任务 单点定时任务方式一&#xff1a;使用ScheduledEnableScheduling注解巨坑&#xff08;Scheduled任务都用了同一个线程去执行&#xff0c;导致定时任务存在堵塞&#xff09;解决办法一&#xff1a;添加自…

linux监控命令

在 Linux 中&#xff0c;有许多命令可以用于监控系统的性能和状态。以下是一些常用的监控命令及其用途&#xff1a; 1. top​ 和 htop​ top ​top​ 命令显示当前系统中运行的进程列表及其资源使用情况。 top​​ ‍ htop ​htop​ 是 top​ 命令的增强版&#xff0c;提…

使用 Spring Event 解耦代码

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 在Spring框架中&#xff0c;事件机制扮演着至关重要的角色&#xff0c;它不仅促进了组件间的互动&#xff0c;还在提高系统灵活性方面迈出了重要步伐。相较于常规的方法调用&#xff0c;这种机制显著提…