【问题标题】:Split physicsBody or alternatives拆分physicsBody或替代品
【发布时间】:2025-12-12 01:05:01
【问题描述】:

我在spritekit中设置了一张占据整个屏幕的图片,它有自己的physicsBody如下:

我设置了触摸方法,以便用户以清晰的颜色在屏幕上“绘制”,实质上是从图片中移除 alpha:

如您所见,我的physicsBody 会随着图像中的alpha 值的变化而变化。现在,随着我越来越接近另一个边缘,physicsBody 会按照它应该的方式运行,保留所有不是 alpha 0 部分的物体:

但是,当纹理最终被一条 alpha 值为 0 的线分割时,物理体会排除其中一个部分:

这是不受欢迎的行为,因为我想保留所有 alpha 值超过身体部分 0 的东西。我尝试将身体分成多个部分,本质上意味着如果在它们之间画一条线,就会有两个身体。但是,如果在其中一个主体内绘制一条线,这仍然不会改变任何内容。

有谁知道如果它们分开了我可以如何拆分它们?也许其他替代方案可以完成相同的任务?谢谢

【问题讨论】:

  • 物理体在这里的用途并不完全清楚。对我来说,这看起来像一个静态节点,那么为什么要使用physicsBody?我将假设您正在为游戏制作“创建自己的角色”编辑器。此外,您需要意识到使用精确的物理物体在计算上非常昂贵。物理体(又名碰撞盒)应该始终是近似值,例如对五边形对象使用圆形(近似平边)。
  • 这是一个更复杂的游戏情况的简化示例。我使用随机图片进行模拟,而实际游戏中的physicsBody 代表了更大的目的。我理解physicsBody 的计算开销,但你必须明白它在我的游戏中是必需的。
  • 请贴一些代码。
  • 什么代码?我什么都没有。

标签: objective-c sprite-kit alpha-transparency skphysicsbody


【解决方案1】:

只需要一个SKNode 来代表整个事情,然后添加一个子SKNode 并附加一个physicsBody。然后,当您检测到用户将主体“拆分”为两半时,减少发生拆分的现有子节点的physicsBody,并添加一个新的子节点,将拆分实体的其余部分作为其physicsBody。如果您多次拆分它,您最终将拥有多个节点,每个节点都有自己的 physicsBody,由父 SKNode 链接在一起(相关)。

你可以这样做(一个节点有一堆孩子),或者创建一个树结构,每次拆分都会进一步将每个孩子的physicsBody 拆分成两个孩子,所以每个节点最多有两个孩子。这将创建一个二叉搜索树,您可以根据需要将其用于碰撞。

【讨论】:

  • 一个节点,一堆子方法的代码示例?
  • 我不知道如何在拆分发生的位置拆分节点
  • 我认为这超出了这个问题的范围。您可以检测空白区域的 x 长度是否等于或大于物理体的宽度。有很多不同的方法你可以做到这一点,但是如果不知道你的代码或你计划做“消隐”的方式,就很难提出建议。
  • 对于一个节点,一堆子节点方法,除了运行检测函数之外,我无法为您提供示例代码,如果它返回 true,则创建一个新节点并使用 parent.addChild() 添加它整个画面的节点。我不能为你做你的工作,我只能建议你可以使用的方法。采用这种方法并自己将其转化为代码,这完全取决于您。
  • 我已经明确说明了我已经运行了一个使用多个节点的检测方法,但效率不够。我不是要求你为我做这项工作 - edist.,长度不必大于或等于屏幕的宽度。这绝不是相关的或工作的。如果您要批评一个完全有效的问题,请不要说话。