【问题标题】:How to make a PhysicsBody based on Alpha Values如何根据 Alpha 值制作 PhysicsBody
【发布时间】:2014-11-15 18:55:37
【问题描述】:

假设有如下场景: 有一个与设备边框大小相同的场景。场景中有一个红色的球,它可以在“世界”中移动。这个世界是由黑色和白色区域定义的,球只能在白色区域内移动。这是一张帮助解释的图片:

可以擦除部分黑色区域,就像用户在场景上用白色绘制一样。这意味着可以移动球的区域不断变化。现在,如何为白色和黑色区域之间的边缘实现一个physicsBody?

我尝试在每次更改物理体时重新定义它,但是一旦形状变得足够复杂,这根本不是一个可行的解决方案。我尝试创建一个不可见的“盒子”二维数组,并指定每个盒子内的大部分区域是白色还是黑色,如果球碰到黑色的盒子,它将被推回。但是,这需要大量的渲染和对数组的过多迭代。由于我的原始数组包含比像素大一点的框,因此我尝试将这些框变大以稍微平滑运动,但这最终导致球的一部分被白色区域停止并看起来在黑色区域内。这是不希望的,因为用户可能会感觉到他们似乎正在撞击的无形障碍。

我尝试寻找其他方法来实现这种“可破坏地形”类型的场景,但我找到并尝试的解决方案是使用其他游戏引擎。为了进一步澄清,我使用的是 Objective-C 和 Apple 的 SpriteKit 框架;而且我不是在寻找一个充满代码的详细类,而是在寻找一些伪代码或实现想法来引导我找到解决方案。

谢谢。

【问题讨论】:

  • 基本上你需要一个轮廓跟踪算法来创建洞穴轮廓的 CGPath。每次洞穴发生变化时,都需要重新运行这个算法并替换现有的边缘循环体。然而,这种追踪和重建形状可能会禁止在实时动作游戏或洞穴几乎一直在变化的地方使用它。
  • 对不起,如果我不够清楚,这是我尝试的第一个解决方案。起初是可行的(洞穴以一个小白圈开始);但是正如你所说,一旦边缘由于不断变化而变得复杂,它就没有用了。

标签: objective-c sprite-kit game-physics terrain code-structure


【解决方案1】:

如果您的部署目标是 iOS 8,这可能就是您正在寻找的...

+ bodyWithTexture:alphaThreshold:size:

这是来自 Apple 文档的描述

从纹理的内容创建一个物理体。只有纹素 超过一定透明度值的都包含在物理中 身体。

其中一个纹素是一个纹理元素。在创建SKPhysicsBody 之前,您需要将图像转换为纹理。

我不确定它是否会像你的画一样在中间留一个洞。如果没有,我怀疑你可以连接两个物理体,一个左半边和一个右半边,形成洞。

【讨论】:

  • 感谢你的好主意,我不知道 iOS 8 有这个功能。事实上,我最初的想法是在身体内部开一个洞(或许多不同的洞,就此而言)。我正在考虑将我的纹理分成许多部分,然后将每个部分用作一个单独的主体(以便能够实现这些孔)。但是,如果一个洞足够小,它仍然不会渲染它。知道如何在没有多个纹理的情​​况下实现“洞”吗?
  • 我个人会将 iOS 8 用于此类游戏。实现它需要更多的努力,而且我猜物理实体只是用户能够绘制的形状的粗略近似。
  • 目标是iOS8,我从来没有说过。但是如果纹理中间有一个洞,spritekit 将无法识别它
  • 这就是为什么我建议将形状分成两部分。为什么需要多个零件?
  • 形状会不断变化。如果其中一个部分有一个整体,那又是什么呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多