为什么 self.kill() 不从组中删除对象?

2023-12-11

我不久前问过这个问题,但答案并不完全有帮助,而且我不相信我发布了最小的可重现示例。一段时间(self.lifetime)过去后,我试图杀死我的子弹。 self.kill() 命令被执行,但它并没有从相机组中删除子弹,这就是我用来绘制所有子弹的。

相关代码: Player.shoot():

    def shoot(self, pos):
    self.current_time = pg.time.get_ticks()
    # Allow the player to shoot (but not continuously)
    if not self.shooting and self.current_time - self.last_shot_time >= self.shoot_cooldown:
        self.last_shot_time = self.current_time
        # Setting self.shooting to True so that only one bullet is created
        self.shooting = True
        # Creating the bullet
        bullet = Bullet(self.rect.centerx, self.rect.centery, "bullet", pos, 2, a_s.camera)

    # Reset self.shooting
    self.shooting = False

Bullet.update():

    def update(self):
    # Killing the bullet after self.lifetime has passed
    if pg.time.get_ticks() - self.start_time > self.lifetime:
        self.kill()
        print("Killing")
    # Moving the bullet (accurately, self.x is float while self.rect.x can only be int)
    self.x += self.vel_x
    self.y += self.vel_y
    self.rect.x = int(self.x)
    self.rect.y = int(self.y)

实体类:(bullet继承于此)

class Entity(pg.sprite.Sprite):
def __init__(self, speed, group):
    pg.sprite.Sprite.__init__(self)
    self.speed = speed
    group.add(self)

我还添加了一个 Pastebin 来允许您重现此示例,但是您需要目录中的 3 个标题为“ground.png”、“player.png”和“bullet.png”的图像才能运行它。

巴斯德宾:https://pastebin.com/Vi57HF1i

我使用的图片(归功于其他人,不确定我从哪里得到它们):https://i.stack.imgur.com/09ocm.jpg


问题与多重继承。每个 *Bullet有 2 个派生自的基类pygame.sprite.Sprite所以每个Bullet实际上由2个精灵组成。这不是故意的,会导致kill 不起作用。你打电话时kill,只是“第一个”pygame.sprite.Sprite对象被从Groups.
可以使用以下最小示例重现该问题:

import pygame

elementGroup = pygame.sprite.Group()
entityGroup = pygame.sprite.Group()

class Element(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        elementGroup.add(self)

class Entity(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        entityGroup.add(self)

class Bullet(Element, Entity):
    def __init__(self):
        Entity.__init__(self)
        Element.__init__(self)

bullet = Bullet()

print(len(elementGroup), len(entityGroup))
bullet.kill()
print(len(elementGroup), len(entityGroup))

Output:

1 1
0 1

为了解决这个问题,你需要重构你的代码。每个类都应该派生自pygame.sprite.Sprite只有一次。

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

为什么 self.kill() 不从组中删除对象? 的相关文章

随机推荐

  • Firebase RecaptchaVerifier.clear() 无效

    我有一个 React Web 应用程序 我想在其中实现电话身份验证 我已经根据文档和示例初始化了 recaptchaVerifier 但是 如果我想再次提交表单 比如因为错误 我收到错误 Error reCAPTCHA has alread
  • Angular2 组件在循环中渲染 2 个 tr 元素

    我需要编写一个具有如下模板的组件 tr tr tr tr 这必须与 ngFor 一起使用来创建表 组件的选择器是spot row 该组件有一个名为的输入变量spot 所需的输出必须如下所示 table tbody tr tr tr tr t
  • sql 只获取表中的第一个记录行,我想要所有

    有人已经帮助我解决了这个查询 但我进行了调整 但遇到了问题 SELECT AVG tyd price AS avg price COUNT tyd id product AS cnt tyd id marchand tyd id produ
  • 以编程方式捕获 HOME 意图

    我需要我的活动来处理 HOME 按钮的按下 以编程方式接收器 但事件未触发 我可以 但是 如果我成功注册并捕获此意图过滤器 在manifest xml 活动部分中声明它 这是代码 接收器不工作 BroadcastReceiver br br
  • 控制器未过滤 DotNetNuke 模块中 Breeze 查询中的数据

    我试图将基本的 Breeze 示例包含在 DotNetNuke 模块中 它在独立的 WebAPI 项目中工作正常 为了简化操作 我删除了客户端 仅引用我在 Chrome 浏览器中进行的 URL JSON 调用 我可以看到我的元数据和完整的项
  • 如何在数码显微照片脚本中使用单个对话框打开多个图像?

    我正在用 DigialMicrograph 脚本编写 我想要一个脚本在一个对话框中打开多个图像 即一个多选图像对话框 类似于您进入任何 Windows 打开对话框 选择多个图像并按 确定 我认为这是可能的 但我还没有找到办法 我想在我的脚本
  • 获取 NoSuchFieldError 实例 org/apache/http/message/BasicHeaderValueParser

    我正在开发 Android 上的应用程序 我正在使用httpcore 4 3 3 当我尝试使用时我得到这个ContentType parse string java lang NoSuchFieldError No static field
  • 所有的无限循环都是不好的吗?

    出于好奇 有all无限循环不好 如果运行无限循环会产生哪些不良影响和后果 另外 如果它们并不全是坏事 您能否举一些例子 说明它们何时能发挥有意义的作用 他们需要有什么东西来关闭实例吗 例如 我们总是在 Java 中使用 StreamRead
  • 有没有办法从 MassTransit 获取原始消息?

    我有一个具有通用参数的消费者IEvent 该类型是所有消息的基接口 以及子接口IEvent还有一些其他属性 我希望能够访问具有嵌套类型的所有属性的原始消息 而不仅仅是IEvent范围 这些属性可以通过 RMQ 管理仪表板查看 我认为应该有一
  • Powershell Invoke-Webrequest 在没有表单的情况下进行页面登录

    I saw 这个帖子没有解决方案 但我的问题是类似的 我正在尝试在我自己的登录页面上自动查找我正在使用的服务的一些信息 当我运行以下命令时 它没有给我任何信息 Forms Webpage Invoke WebRequest Uri http
  • Python pandas:读取带有多个表重复前导码的csv

    有没有一种Python式的方法来找出CSV文件中的哪些行包含标题和值以及哪些行包含垃圾 然后将标题 值行放入数据框中 我对 python 比较陌生 一直使用它来读取从科学仪器的数据日志导出的多个 CSV 到目前为止 在处理其他任务的 CSV
  • Modbus 错误:[输入/输出] 未收到来自远程设备的响应

    我尝试从 Mac 笔记本电脑连接到 Modbus 设备 MR SI4 使用串行连接 使用 USB RS485 转换器 安装 到 dev cu SLAB USBtoUART 这是我的代码 import logging logging basi
  • 如何通过bundle发送对象

    我需要传递对通过包进行大部分处理的类的引用 问题是它与意图或上下文无关 并且具有大量非原始对象 如何将类打包成可打包 可序列化并将其传递给startActivityForResult 您还可以使用 Gson 将对象转换为 JSONObjec
  • querydsl生成的q源代码未正确导入

    我正在尝试将 querydsl 添加到现有系统 但在获取生成的 Q 源进行编译时遇到问题 我读过几个类似的问题和解释 https spring io blog 2015 09 04 what s new in spring data rel
  • Lucene 搜索匹配短语中的任何单词

    我想搜索包含很多单词的字符串 并检索与其中任何单词匹配的文档 我的索引方法如下 Document document new Document document add new TextField termos text Field Stor
  • 使用 GridF 从 mongoDB 读取和显示图像

    我已经能够使用 GridFs 成功将图像上传到 mongoDB 以下是我的数据库中的图像 fs 文件 fs 块 下面是我用来上传图片的代码 var Grid require gridfs stream var mongoose requir
  • Ionic 4. NavParams 的替代方案

    我正在使用 ionic 4 它不接受使用 navparams 接收数据 这是我的发件人页面方法 private route Router gotoFinalView intent this route navigateByUrl inten
  • 3 次划分的中位数

    我找到了以下代码 用于使用第一个 最后一个和中间元素的中值查找快速排序的枢轴 int middle low high 2 if a middle compareTo a low lt 0 swapReferences a low middl
  • 内核启动和内核执行之间的时间

    我正在尝试使用 VS 2010 的 Parallel Nsight 2 1 版本来优化我的 CUDA 程序 我的程序在带有 GTX 480 板的 Windows 7 32 位 机器上运行 我已经安装了 CUDA 4 1 32 位工具包和 3
  • 为什么 self.kill() 不从组中删除对象?

    我不久前问过这个问题 但答案并不完全有帮助 而且我不相信我发布了最小的可重现示例 一段时间 self lifetime 过去后 我试图杀死我的子弹 self kill 命令被执行 但它并没有从相机组中删除子弹 这就是我用来绘制所有子弹的 相