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 根据位置重叠精灵(绘制顺序) 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 摩卡作为图书馆

    我想使用 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