SpriteKit: 物理引擎的“alpha”形状问题

4
我正在与我的儿子一起开发一款基于Paul Hudson的Dive Into SpriteKit书籍的基础游戏。
按照书上的指示,我们为太空船和太空垃圾卫星创建了一个精灵。虽然它可以运作,但我们注意到有时飞船会穿过垃圾。我们尝试使用场景编辑器添加精灵并打开物理引擎:

picture showing the issues with physics body shapes

引人注目的是,使用场景编辑器添加的船节点生成的物理体轮廓完全错误,但是进行...
player.physicsBody = SKPhysicsBody(texture: player.texture!, size: player.size)

这对修复火箭飞船很有效,但对于垃圾卫星精灵进行相同的操作总是会产生相同的复杂物理实体。

我唯一的猜测是加载和分析纹理的方式存在问题。这可以解释为什么重复执行此操作会修复火箭飞船,但是卫星有何问题呢?如何确保正确准备纹理以使物理实体的 alpha 掩码可靠工作?

我将感激任何关于如何解决这个问题的建议。

我尝试使用 alphaThreshold: 对船的轮廓线条有所改善,但似乎对卫星轮廓没有影响。

我尝试重新绘制卫星纹理,以排除书中原始文件的问题。使用类似形状的全新文件时,问题完全相同。

我们还测试了 iOS 12 和 iOS 13,结果相同。书中的"规范"代码也有完全相同的问题。

请查看我们游戏的 GitHub 完整实现

在我们的游戏之外,快速复现此问题的方法:

  1. 在Xcode中使用游戏模板创建新项目
  2. 将卫星资源添加到资源目录中:

satellite

  1. 在GameScene.sks中添加彩色精灵,选择卫星纹理,并在物理定义部分将主体类型设置为“阿尔法蒙版”。

我们的结果如下所示:

enter image description here

预期结果是一个准确的精灵轮廓。

凹形状对物理体是一个问题。 - undefined
@Knight0fDragon,感觉很奇怪,在书籍或SpriteKit文档中都没有提到这个问题被取消了。我还不确定该怎么处理,但可以手动绘制身体形状。 - undefined
即使你手动绘制,也会遇到碰撞问题。建议使用多体系统。 - undefined
我在更新我们的一个2016年代码的应用程序后遇到了几乎完全相同的问题。SKPhysicsBody(texture:size:)不再适用于我们的透明PNG图像。物理体看起来像是我们精灵的不规则版本。我们的精灵也是凹面的。在模拟器上似乎可以工作,但在iOS设备上却不行。 - undefined
1个回答

0
这个问题现在似乎已经解决了。要检查它,请将以下这行代码添加到你的场景或视图控制器中:
view.showsPhysics = true

纹理必须连续(一部分),内部不能有任何孔洞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接