Pygame 教程(6):使用精灵

这篇具有很好参考价值的文章主要介绍了Pygame 教程(6):使用精灵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章,你将学习如何使用 Pygame 中的精灵。

导航

上一章:监测游戏时间

精灵

当游戏对象变得繁多的时候,把所有游戏对象的处理存放在一个个函数中,虽然是一种可行的方法,但是会使代码逻辑比较混乱,难以维护。这时,精灵(sprite) 应运而生。使用精灵,可以将游戏对象封装到一个个类当中,以将处理游戏对象的逻辑与主代码逻辑分离开,使代码架构更加清晰明了。

Pygame 中,通过pygame.sprite模块使用精灵。该模块定义了Sprite类(用于定义精灵)和Group类(用于管理精灵的容器)以及一些继承于这两个类的拓展类和检测精灵碰撞的函数。

下面将主要介绍SpriteGroup类,以及常用的检测碰撞的函数。

Sprite

pygame.sprite.Sprite通常作为可见游戏对象的基类。构造函数Sprite(*groups) -> Sprite接受任意数量的Group容器以添加到这些容器中。

继承它的子类需要为imagerect属性赋值。image属性是一个pygame.Surface对象,指定该游戏对象的图像。rect属性是一个pygame.Rect对象,用于指定该游戏对象的位置,也用于检测精灵碰撞而使用。

Sprite类中定义的方法如下表(详见官方文档):

方法定义 方法作用
update(*args, **kwargs) -> None 用于控制精灵行为的方法,通常子类需要重写该方法。当调用了Group.update方法时,组中的所有精灵都会被调用Sprite.update方法,如果在Group.update方法中传入了参数,参数也将被传入Sprite.update方法中。
add(*groups) -> None 任意数量的Group对象作为参数传递,精灵将被添加到尚未成为成员的组中。
remove(*groups) -> None 任意数量的Group对象作为参数传递,精灵将从它所在的组中移除。
kill() -> None 将精灵从所有包含它的组中移除,这并不会改变本身的状态,之后也可以继续使用该精灵。
alive() -> bool 判断此精灵是否属于1个或多个组。
groups() -> group_list 返回包含此精灵的Group对象的列表。

Group

pygame.sprite.Group类通常作为用于管理多个Sprite对象的容器。此类也可以被继承以创建有更具体行为的容器。构造函数Group(*sprites) -> Group接受任意数量的Sprite对象作为参数以添加到容器中。Group类还支持以下标准的 Python 操作:

  • in,判断是否包含了某个精灵。
  • len,获取组中的精灵总数。
  • bool,判断组中是否包含任何精灵。
  • iter,迭代组中所有的精灵。

Group类中定义的方法如下表(详见官方文档):

方法定义 方法作用
sprites() -> sprite_list 返回组中包含的所有精灵的列表。
copy() -> Group 创建该组的副本。
add(*sprites) -> None 向组中添加任意数量的精灵,只添加尚未成为改组成员的精灵。
remove(*sprites) -> None 从组中删除任意数量的精灵。只删除是该组成员的精灵。
has(*sprites) -> bool 判断组中是否包含给定的所有精灵。
update(*args, **kwargs) -> None 对组中所有的精灵调用Sprite.update方法,被传入Group.update方法的参数也将传入Sprite.update方法中。
draw(Surface) -> List[Rect] 将组中包含的所有精灵绘制到给定的图像上,使用每个精灵的image属性作为源图像,rect属性作为位置。Group并不保存精灵的顺序,所以绘制顺序是任意的。
clear(Surface_dest, background) -> None 在给定的图像上清除上次调用Group.draw方法所使用的精灵,通过在对应精灵的位置上进行填充来清除。参数background通常是一个Surface图像,要求尺寸与目标图像相同,但是也可以是一个回调函数,需要两个参数:目标图像和要清除的区域。
clear(Surface_dest, background) -> None 从组中移除所有的精灵。

碰撞检测函数

sprite模块中还定义了一些碰撞检测函数。以下内容将介绍常用的函数(详见官方文档)。

spritecollide(sprite, group, dokill, collided = None) -> Sprite_list:返回一个组中与一个精灵相交的所有的精灵的列表。布尔参数dokill指定是否将所有将组中所有碰撞的精灵删除。可选的参数collided是一个回调函数,用于计算两个精灵是否碰撞,它应该把两个精灵作为参数,并返回一个布尔值,表明是否相撞。如果没有传递collided参数,则所有精灵都要求有rect属性,用于计算碰撞。collided可以传入的 Pygame 内置函数有:collide_rectcollide_rect_ratiocollide_circlecollide_circle_ratiocollide_mask

collide_rect(left, right) -> bool:使用pygame.Rect.collide_rect方法检测两个精灵之间的碰撞,要求两个精灵都有rect属性。

collide_rect_ratio(ratio) -> collided_callable:一个可调用的类,collide_rect函数的可缩放版本,初始化时传入一个比率。

collide_circle(left, right) -> bool:通过检测以精灵为中心的两个圆是否重叠来检测碰撞。如果精灵有radius属性,将被用来创建圆,否则,将创建一个足够大的圆完全包围精灵的rect属性。两个精灵必须有rect属性和可选的radius属性。

collide_circle_ratio(ratio) -> collided_callable:一个可调用的类,collide_circle函数的可缩放版本,初始化时传入一个比率。

groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict:参数与spritecollide函数类似,找到所有在两组之间发生碰撞的精灵。group1中的所有精灵将添加为返回字典的键,而每个键对应的值就是group2中与该精灵发生碰撞的精灵列表。

spritecollideany(sprite, group, collided = None) -> Sprite | None:简单测试精灵是否与组中任何一个精灵相撞,如果有碰撞,将返回组中的一个精灵,否则,返回None

实例:弹球

本实例将利用Sprite创建一个弹球引用程序。

请创建一个新的文件,命名为ball.py,并添加以下代码:

import sys

import pygame


class BallGame:
    def __init__(self) -> None:
        self.screen = pygame.display.set_mode((600, 600))
        pygame.display.set_caption('Ball')

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

            pygame.display.flip()


if __name__ == '__main__':
    game = BallGame()
    game.run()

创建精灵

我们需要创建一个继承于Sprite类的精灵类Ball,在BallGame之前添加如下代码:

class Ball(pygame.sprite.Sprite):
    def __init__(self, screen_rect) -> None:
        super().__init__()
        self.image = pygame.Surface((20, 20))
        pygame.draw.circle(self.image, (255, 255, 255), (10, 10), 10)
        self.screen_rect = screen_rect
        self.rect = self.image.get_rect()
        self.rect.center = self.screen_rect.center

        self.vel = (2, 1)

    def update(self):
        self.rect.x += self.vel[0]
        self.rect.y += self.vel[1]
        if self.rect.left < 0 or self.rect.right > self.screen_rect.width:
            self.vel = (-self.vel[0], self.vel[1])
        if self.rect.top < 0 or self.rect.bottom > self.screen_rect.height:
            self.vel = (self.vel[0], -self.vel[1])

上述代码中,Ball类继承于Sprite类,以定义一个精灵,并且使用pygame.draw.circle函数在image上绘制了一个白色的圆,同时将rect定位到屏幕矩形的中心。

update方法中,更新了rect的位置,并防止球超出屏幕范围。

使用精灵

更改BallGame类的方法,代码如下:

class BallGame:
    def __init__(self) -> None:
        self.screen = pygame.display.set_mode((600, 600))
        pygame.display.set_caption('Ball')
        self.ball = Ball(self.screen.get_rect())

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

            self.screen.fill((0, 0, 0))
            self.ball.update()
            self.screen.blit(self.ball.image, self.ball.rect)

            pygame.display.flip()

这里并没有使用Group来组织精灵,是因为我们只使用了一个精灵,无需使用它。

完整代码

import sys

import pygame


class Ball(pygame.sprite.Sprite):
    def __init__(self, screen_rect) -> None:
        super().__init__()
        self.image = pygame.Surface((20, 20))
        pygame.draw.circle(self.image, (255, 255, 255), (10, 10), 10)
        self.screen_rect = screen_rect
        self.rect = self.image.get_rect()
        self.rect.center = self.screen_rect.center

        self.vel = (2, 1)

    def update(self):
        self.rect.x += self.vel[0]
        self.rect.y += self.vel[1]
        if self.rect.left < 0 or self.rect.right > self.screen_rect.width:
            self.vel = (-self.vel[0], self.vel[1])
        if self.rect.top < 0 or self.rect.bottom > self.screen_rect.height:
            self.vel = (self.vel[0], -self.vel[1])


class BallGame:
    def __init__(self) -> None:
        self.screen = pygame.display.set_mode((600, 600))
        pygame.display.set_caption('Ball')
        self.ball = Ball(self.screen.get_rect())

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

            self.screen.fill((0, 0, 0))
            self.ball.update()
            self.screen.blit(self.ball.image, self.ball.rect)

            pygame.display.flip()


if __name__ == '__main__':
    game = BallGame()
    game.run()

代码运行截图:

pygame精灵,Pygame 教程,pygame,python,游戏

结语(很重要!!)

至此,Pygame 教程已经结束啦🎉🎉!!!通过此教程,你已经学会了 Pygame 的基础知识。你已经可以尝试自己编写简单的应用了。笔者也会努力更新,争取写出更多好的作品。文章来源地址https://www.toymoban.com/news/detail-768948.html

到了这里,关于Pygame 教程(6):使用精灵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在pycharm中安装pygame游戏插件 和Python中安装pygame教程

    在用pycharm软件开发python小游戏前,需要安装pygame的插件,如何安装呢? 方法一、包管理器安装 1、在pycharm软件中定位到  file  – settings 2、定位到: project (自己的项目中)–python interpreter,选择右边的 pip 3、双击 pip ,进入查询插件界面,输入  pygame  ,进行查询这个插件

    2024年02月02日
    浏览(47)
  • Python Pygame游戏开发教程正式发布(非常详细)

    Pygame 是一款专门为开发和设计 2D 电子游戏而生的、免费开源的 Python 软件包/模块,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性 Pygame 在 SDL 的基础上开发而成,它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏

    2024年04月13日
    浏览(48)
  • 很合适新手入门使用的Python游戏开发包pygame实例教程-01[开发环境配置与第一个界面]

    我们假定你已经安装好了我们开发python程序的sublime text,如果不知道怎么安装的可以参照我前面的博文。这里只需要解决的是配置好Pygame的问题。本篇博文主要解决开发环境配置以及第一个游戏界面的显示问题。 文章原出处: https://blog.csdn.net/haigear/article/details/130173836 没有

    2024年01月25日
    浏览(96)
  • 【Python】【进阶篇】十一、Pygame的精灵和碰撞检测

    精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。 精灵有个特点就是允许精灵之间进行交互,也称之为碰撞,而碰撞检测,指的就是检测两个精灵

    2024年02月13日
    浏览(42)
  • Python Pygame 游戏开发基础教程与项目实践(总目录)

    原文链接:https://xiets.blog.csdn.net/article/details/131368147 版权声明:原创文章禁止转载 Pygame 是一个免费的开源的跨平台库(支持 Windows、MacOS、Linux),用于使用 Python 开发视频游戏等多媒体应用程序。 Pygame 基础教程01: Python (Pygame) 游戏开发模块简介与安装 Pygame 基础教程02: 显示

    2024年02月14日
    浏览(46)
  • pygame超详细教程!!做python小游戏必看框架!

    # 导入需要的模块 # 定义一个游戏管理总类 # 定义一个check_event 方法用于阻塞事件,并在检测到\\\"QUIT\\\"事件时关闭窗口 # run 方法则是游戏的主循环,不断调用 check_event 方法, 加上flip()  , 每次添加新功能,即可更新画布 # 调用gm实例 到这里,我们就能做出一个空白的黑窗体了,

    2024年02月07日
    浏览(47)
  • 使用Python+pygame实现贪吃蛇小游戏

    使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 给出两种实现。 第一种 运行效果如下: 游戏源码如下: 第二种 就不给出运行效果图了,你可以运行看看。 下面给出另一种实现源码: OK! 

    2024年01月16日
    浏览(81)
  • 【附源码】使用python+pygame开发消消乐游戏

    消消乐小游戏相信大家都玩过,大人小孩都喜欢玩的一款小游戏,那么基于程序是如何实现的呢?今天带大家,用python+pygame来实现一下这个花里胡哨的消消乐小游戏功能,感兴趣的朋友一起看看吧 目录 一、环境要求 二、游戏简介 三、完整开发流程 1、项目主结构 2、详细配

    2024年02月04日
    浏览(64)
  • 在Python中使用Pygame开发游戏的100条建议

    Pygame是一个用于制作游戏的Python库。它提供了许多功能,使您可以轻松地创建2D游戏和多媒体应用程序。下面是一些使用Pygame库的基本步骤: 安装Pygame 首先,您需要安装Pygame库。您可以使用pip命令在命令行中安装它: 导入Pygame模块 在Python脚本中,您需要导入Pygame模块,以便

    2024年03月11日
    浏览(54)
  • 使用 Python 和 Pygame 制作游戏:第九章到第十章

    原文: inventwithpython.com/pygame/chapter9.html 译者:飞龙 协议:CC BY-NC-SA 4.0           推星星是 Sokoban 或“箱子推动者”的克隆。玩家位于一个房间,里面有几颗星星。房间中的一些瓷砖精灵上有星星标记。玩家必须想办法将星星推到有星星标记的瓷砖上。如果墙壁或其他星星

    2024年01月22日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包