首页 > 解决方案 > 区分单个精灵上的多个物理体

问题描述

假设我有三个精灵;一个玩家、一个三角形和一个正方形。

三角形和方形节点各有一个SKPhysicsBody分配,而玩家节点有两个 - 内部和外部,大小不同。

内部仅用于记录与三角形的接触,而外部用于记录与正方形的接触。

我已将每个物理体分配给玩家节点:

playerNode.physicsBody = SKPhysicsBody(bodies: [inner, outer])

并给每个人一个名字:

inner.node?.name = "inner"
outer.node?.name = "outer"

但是,在联系 中的任何一个时didBegin,打印:

contact.bodyB.node?.physicsBody?.node?.name 

显示 nil,如果有,则显示播放器节点的名称。这与打印不同:

contact.bodyB.node?.name

这是针对播放器节点本身的。如果一个物理体有自己的名字,为什么我不能识别它以将它与另一个物理体区分开来?

标签: swiftsprite-kitskphysicsbody

解决方案


这是因为你实际上并没有做你想做的事情:

三角形和方形节点每个都有一个 SKPhysicsBody 分配,而玩家节点有两个 - 一个内部和一个不同大小的外部。

当您尝试使用此行将 2 个物理实体分配给玩家节点时:

playerNode.physicsBody = SKPhysicsBody(bodies: [inner, outer])

您实际上所做的是创建一个新的物理体(它是物理体inner和的联合体outer)并将这个新的物理体(没有名称)分配给您的玩家节点。

https://developer.apple.com/documentation/spritekit/skphysicsbody/1519736-init

通过执行一组基于体积的物理体的联合来创建一个物理体。

所以玩家仍然只有一个物理体(既不是内部也不是外部),这是一个节点所能拥有的。

实现这一工作的一种方法是创建 2 个新节点——playerInner也许playerOuter每个节点都有自己的物理体——然后加入这些节点以创建玩家节点。(playerInner 可能是 的子节点playerOuter


推荐阅读