Pygame 根据位置重叠精灵(绘制顺序)

2024-03-11

总的来说,我对 Pygame 和 Python 还比较陌生,所以希望这不是太陌生。

I'm making a top-down RPG, and I have two Sprite objects with images that look (for example) like these:
enter image description here enter image description here

使用不代表整个图像的矩形:

class NPC(pygame.sprite.Sprite):
    def __init__(self, image, pos, *groups):
        super().__init__(*groups)
        self.image = pygame.load(image)
        self.rect = self.image.get_rect()
        self.collisionRect = pygame.Rect(self.rect.left, self.rect.top + 12, self.image.get_width(), self.image.get_width()) 
        #12 is the number of pixels that will overlap in the y-dimension

我这样做是因为我希望 NPC 的顶部几个像素与其他精灵重叠。这collisionRect在每个对象上使用rect每当我检测到碰撞时,我就可以创建这种效果。

但是,我需要一种方法在 update() 函数中重新绘制它们,以便一个绘制另一个基于它们彼此的相对位置。

因此,当一个 NPC 位于另一个 NPC 上方时,它看起来像这样:

但是,当情况相反时,它应该看起来像这样:

这意味着需要以不同的顺序绘制图像,具体取决于哪个精灵位于另一个精灵的“下方”。

我考虑过可能将精灵切割成单独的精灵,然后最后绘制“头部”精灵,但我想知道是否有一种更简单(或至少可靠)的方法detect是否应该最后绘制一个精灵,基于它是否与另一个精灵重叠and在 y 维度上紧邻其下方。

如果这个问题太宽泛或需要更多背景信息,我深表歉意;如果需要的话可以提供。


正如金斯利在评论中已经说过的那样,按精灵对精灵进行排序y坐标是实现此目的的常用方法。

这是一个完整的运行示例(我将您的图像命名为guy.png and gal.png)。由于您已经使用了精灵,所以我使用了一个简单的pygame.sprite.Group-子类:

import pygame

class Actor(pygame.sprite.Sprite):
    def __init__(self, image, pos):
        super().__init__()
        self.image = image
        self.pos = pygame.Vector2(pos)
        self.rect = self.image.get_rect(center=self.pos)

    def update(self, events, dt):
        pass

class Player(Actor):
    def __init__(self, image, pos):
        super().__init__(image, pos)

    def update(self, events, dt):
        pressed = pygame.key.get_pressed()
        move = pygame.Vector2((0, 0))
        if pressed[pygame.K_w]: move += (0, -1)
        if pressed[pygame.K_a]: move += (-1, 0)
        if pressed[pygame.K_s]: move += (0, 1)
        if pressed[pygame.K_d]: move += (1, 0)
        if move.length() > 0: move.normalize_ip()
        self.pos += move*(dt/5)
        self.rect.center = self.pos

class YAwareGroup(pygame.sprite.Group):
    def by_y(self, spr):
        return spr.pos.y

    def draw(self, surface):
        sprites = self.sprites()
        surface_blit = surface.blit
        for spr in sorted(sprites, key=self.by_y):
            self.spritedict[spr] = surface_blit(spr.image, spr.rect)
        self.lostsprites = []

def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))
    clock = pygame.time.Clock()
    dt = 0

    sprites = YAwareGroup(Player(pygame.image.load('guy.png').convert_alpha(), (100, 200)),
                          Actor(pygame.image.load('gal.png').convert_alpha(), (200, 200)))

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return

        sprites.update(events, dt)
        screen.fill((30, 30, 30))
        sprites.draw(screen)

        pygame.display.update()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()

如果您需要自定义绘图逻辑,将 pygame 子类化通常不是最糟糕的主意Group类。你可以找到他们的来源here https://github.com/pygame/pygame看看它们是如何工作的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pygame 根据位置重叠精灵(绘制顺序) 的相关文章

  • 使用 JPype - 如何访问 JDBC 元数据函数

    我在用着杰 德贝API https launchpad net jaydebeapi它使用 JPype 加载 FileMaker 的 JDBC 驱动程序并提取数据 但我也希望能够获取所有表的列表在数据库中 In the JDBC 文档 ht
  • 配置 PIP 以在代理后面工作

    我已经安装了 python 3 4 3 附带pip 我想从代理后面使用 pip 所以我执行了以下操作 Created C Users foo pip pip ini并添加了代理配置部分 proxy export http proxy my
  • 如何在anaconda python 3.6上安装tensorflow

    我使用 anaconda 包安装了新版本的 python 3 6 但是我无法安装张量流 总是收到这样的错误 tensorflow gpu 1 0 0rc2 cp35 cp35m win amd64 whl 在此平台上不受支持 如何在 ana
  • 让 Django 提供可下载文件

    我希望网站上的用户能够下载路径被遮挡的文件 因此无法直接下载它们 例如 我希望 URL 是这样的 http example com download f somefile txt 在服务器上 我知道所有可下载的文件都位于该文件夹中 home
  • Native TF 与 Keras TF 性能比较

    我使用本机和后端张量流创建了完全相同的网络 但在使用多个不同参数进行了多个小时的测试后 仍然无法弄清楚为什么 keras 优于本机张量流并产生更好 稍微但更好 的结果 Keras 是否实现了不同的权重初始化方法 或者执行除 tf train
  • 打开文件路径在 python 中不起作用[重复]

    这个问题在这里已经有答案了 我正在编写一个数据库程序 personica 是我的测试主题 我通常在文件路径的位置有一个变量 但出于测试和演示的目的 我只有一个字符串 在我的计算机上的这个确切位置有一个文本文件 顺便说一句 因为我很偏执 所以
  • 以编程方式结束/退出粘合作业

    我正在使用 Glue 书签来处理数据 我的工作是每天安排的 但也可以 手动 启动 由于我使用书签 有时胶水作业可以在没有新数据要处理的情况下启动 然后读取的数据帧为空 在这种情况下 我想好好地结束我的工作 因为它没有什么关系 我试过 if
  • 为什么 pandas.DataFrame.update 会更改更新后的数据帧的数据类型?

    出于显而易见的原因 我想在更新后将列的数据类型保留为 int 有什么想法为什么这不能按预期工作吗 import pandas as pd df1 pd DataFrame a 1 b 2 c foo a 3 b 4 c baz df2 pd
  • 在Python中整齐地绘制PMF

    有没有一个库可以帮助我在 python 中整齐地绘制样本的概率质量函数 如下所示 通过matplotlib pyplot的stem模块 matplotlib pyplot stem args kwargs from matplotlib p
  • 我可以在pycharm中的断点处进入交互模式吗

    我是一个相当新的 Pycharm 3 用户 正在从事 django 项目 我可以在 pycharm3 中的断点处进入交互模式吗 这可能吗 当程序在断点处停止时 我尝试过工具 gt 打开调试命令行 但我没有看到控制台打开 我怎样才能让它发挥作
  • 统计Sweep算子的Python实现

    我正在学习一些用书中缺失的数据进行统计的技术 缺失数据的统计分析作者 利特尔和鲁宾 对于处理单调无响应数据来说 一个特别有用的函数是扫频操作员 详情见第 148 151 页 我知道 R 模块gmm有swp函数可以做到这一点 但我想知道是否有
  • 如何在 Django 中像应用程序一样从配置中注册 Flask 蓝图?

    如何从我的配置中注册 Flask 蓝图 就像 Django 中的应用程序一样 我想在配置文件中定义蓝图 它将自动注册 config py BLUEPRINTS news files 实际上我一直在一个暂定名为的项目中勾勒出类似的东西臀部口袋
  • pandas groupby 并转换为 json 列表

    我有一个如下所示的 pandas 数据框 idx f1 f2 f3 1 a a b 2 b a c 3 a b c 87 e e e 我需要将其他列转换为基于索引列的字典列表 所以 最终结果应该是 idx features 1 f1 a f
  • 在 Python 中通过网络发送对象的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要通过网络发送对象 我将使用 Twisted 并且我刚刚开始查看它的文档 据我所知 python实现套接字的唯一方式是通过文本 那么我如何使
  • Python:两个列表之间的成对比较:列表 a >= 列表 b?

    如果我想检查列表中的所有元素 a 1 2 3 6 大于或等于另一个列表中对应的元素 b 0 2 3 5 如果 a i gt b i 对于所有i的 则返回 true 否则返回 false 这有逻辑功能吗 比如a gt b 谢谢 你可以这样做
  • 使用 Python 获取 Youtube 数据

    我正在尝试学习如何分析网络上可用的社交媒体数据 我从 Youtube 开始 from apiclient errors import HttpError from outh2client tools import argparser fro
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • Pandas 数据框可对多列和要列出的值进行字典

    我有一个数据框 id key a1 1 a2 1 a3 1 a4 2 a5 2 a6 3 我想创建一本字典key作为机器号 并且id列作为列表 like 1 a1 a2 a3 2 a4 a5 3 a6 我可以先使用 groupby 然后再使
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不
  • 我可以以某种方式“编译”一个Python脚本以在没有安装Python的PC上运行吗?

    所以我有一个Python脚本 myscript py 我是这样执行的 python D myscript py 但是 我必须安装 Python 并将其包含在PATH使其工作的环境变量 是否有可能以某种方式将 Python 可执行文件与 Py

随机推荐

  • 摩卡作为图书馆

    我想使用 mocha node js 测试框架 而不是 ruby 模拟库 作为库 而不是使用 mocha 可执行文件来运行我的测试 是否可以通过这种方式运行摩卡测试 这些示例都只是调用 mocha 库 假设它们已经是 require 并且
  • 使用引导网格系统嵌套行?

    我想要 1 个较大的图像和 4 个 2x2 格式的较小图像 如下所示 我最初的想法是将所有东西都放在一排 然后创建两列 并在第二列中创建两行和两列以创建 1x1 和 2x2 效果 但是 这似乎不可能 或者我只是做得不正确 引导版本 3 x
  • 如何编写 Webpack 插件,根据其他模块动态地将模块添加到捆绑包中?

    我在为翻译服务编写 Webpack 插件时遇到问题 目标是 获取编译期间所有必需模块的名称 和源代码 我需要能够扫描包含的源代码以获取特殊的t 函数用法 但我只想扫描那些将包含在捆绑包中的模块 根据构建配置 这些模块可以是所有项目模块的子集
  • 成功插入数据后如何清除单选按钮列表?

    任何人都可以帮我解决这个简单的问题 如何在提交表单后清除单选按钮列表的选择 我需要在我的 ASP NET Web 应用程序中使用它 当用户单击清除按钮时 我需要清除单选按钮列表的选择 提前致谢 你可以 设置 myrbList Selecte
  • 删除带有嵌入空格的路径中的所有 .SVN 文件夹

    In 这个问题 https stackoverflow com questions 5935776 how to delete svn folders in my source tree 13850323 13850323以及其他一百个地方
  • Python - Pandas:给定行中最小值的数字/索引

    我有一个 pandas 数据框 具有一行和多列 我想获取给定行中最小值的列号 索引 我找到的代码是 df columns get loc colname 上面的代码要求提供列名称 我的数据框没有列名 我想获取最小值的列位置 Use argm
  • Android Studio:设计视图中“创建景观变化”的按钮在哪里?

    我在哪里可以找到按钮创造景观变化 https stackoverflow com questions 28815769 android studio creating landscape layouts answer 29467041 在我
  • 如何在 SQLiteDatabase 查询中测试光标是否为空

    我有一个由以下代码创建的 SQL 表 public void onCreate SQLiteDatabase db db execSQL CREATE TABLE TABLE NAME ID INTEGER PRIMARY KEY AUTO
  • 布尔值 FALSE 和 TRUE 可以重新定义吗

    我正在读一本关于 PHP 以及如何使用 PHP 的书TRUE and FALSE 它说 事实上 小写版本更稳定 因为 PHP 不 允许您重新定义它们 大写的可以重新定义 我尝试重新定义TRUE and FALSE 但没有成功 我谷歌重新定义
  • 存储大量数据:数据库还是文件系统?

    假设我的应用程序创建 存储和检索大量条目 数千万 每个条目具有可变数量的不同数据 例如 某些条目仅具有几个字节 例如ID 标题 而某些条目可能具有兆字节的补充数据 每个条目的基本结构相同 并且采用 XML 格式 条目是任意创建和编辑的 很可
  • 从 CouchDB 解析 JSON 时如何超越“total_rows”

    我使用以下 jQuery 代码从 CouchDB 获取 JSON 文件 Function getURL var api url http 127 0 0 1 5984 couchcontentqueue design DocCollecti
  • 子类化后的委托?

    抱歉 我无法为标题提出一个简短的问题 如果我使用委托协议和属性对一个类进行子类化 我的委托是否仍然需要实现超类的委托协议 或者我是否必须为子类定义一个新的委托协议 就我而言 我细分了UIImagePickerController UIIma
  • Google 语音 API - php 不返回任何内容

    我的代码受到用于语音转文本的全双工谷歌语音 API 的 php 版本的启发 http mikepultz com 2013 07 google speech api full duplex php version http mikepult
  • Swift 中的构建器模式设置方法

    我刚刚从 Android 基础转移到 ios 在 swift 中寻找构建器模式 get 和 set 方法 但找不到类似的东西 仅发现以下内容 var ptype String get return self ptype set ptype
  • Spring WebSocket 使用 SockJS 连接到不同的域

    Spring 中的 WebSockets 是一个相当新的主题 我厌倦了寻找更多内容 我的问题是连接到来自不同域的服务 我正在与 Lineman 一起构建前端 并与 Spring Boot 一起构建后端 我在两个不同的端口上有这些应用程序 8
  • 删除 QGridLayout 中的所有间距

    我正在尝试以编程方式 使用 Qt 4 6 构建一个包含一系列的窗口QPushButton的 全部挤在一起 它应该看起来像这样 我称之为工具箱 工具箱图像http img99 imageshack us img99 9853 examplez
  • WPF 中的报表查看器

    我有一个WPF项目 我需要预览水晶报表 是否有可能做到这一点 我在 WPF 项目中找不到报表查看器控件 thanks 您可以使用CrystalReportViewerWindows 窗体与 Windows 窗体互操作技术的结合 将查看器添加
  • PhpDocs:链接到“@deprecated”标签描述中的另一个方法?

    是否可以链接到另一个方法 类 属性 等 在我的项目内联内 deprecated标签 像这样 Method description deprecated 1 0 Reason for deprecation use link newMetho
  • QXcbIntegration:无法创建平台 OpenGL 上下文,GLX 和 EGL 均未启用

    我有一个用 QT 和 OpenGL 构建的 unix 二进制文件 我试图在 linux 64 上执行它 它是一个简单的可视化程序 显示 2d 和 3d 图形 我已经安装了所有必需的依赖项 例如 QT 和 openGL 库 但是 我在尝试执行
  • Pygame 根据位置重叠精灵(绘制顺序)

    总的来说 我对 Pygame 和 Python 还比较陌生 所以希望这不是太陌生 I m making a top down RPG and I have two Sprite objects with images that look f