swift - 区分单个精灵上的多个物理体
问题描述
假设我有三个精灵;一个玩家、一个三角形和一个正方形。
三角形和方形节点各有一个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
这是针对播放器节点本身的。如果一个物理体有自己的名字,为什么我不能识别它以将它与另一个物理体区分开来?
解决方案
这是因为你实际上并没有做你想做的事情:
三角形和方形节点每个都有一个 SKPhysicsBody 分配,而玩家节点有两个 - 一个内部和一个不同大小的外部。
当您尝试使用此行将 2 个物理实体分配给玩家节点时:
playerNode.physicsBody = SKPhysicsBody(bodies: [inner, outer])
您实际上所做的是创建一个新的物理体(它是物理体inner
和的联合体outer
)并将这个新的物理体(没有名称)分配给您的玩家节点。
https://developer.apple.com/documentation/spritekit/skphysicsbody/1519736-init
通过执行一组基于体积的物理体的联合来创建一个物理体。
所以玩家仍然只有一个物理体(既不是内部也不是外部),这是一个节点所能拥有的。
实现这一工作的一种方法是创建 2 个新节点——playerInner
也许playerOuter
每个节点都有自己的物理体——然后加入这些节点以创建玩家节点。(playerInner
可能是 的子节点playerOuter
)
推荐阅读
- javascript - 如何循环遍历所有元素
- cmake - CMake进行编译定义另一个的别名
- reactjs - PrivateRoute 呈现空白页面...在反应 js 中没有显示错误
- java - 如何打印存储为对象变量的任何类型的数组?
- ethereum - 使用 Node 运行 Compound 存储库
- php - 如何在 Woocommerce 中修改小部件的 innerHTML
- raspberry-pi - 视频过滤器调整不适用于 rasperry pi
- javascript - 文本未显示在世博会应用程序上。我认为道具没有被正确传递。我应该如何纠正?
- tensorflow - 加载模型后暗网停止训练
- r - 过滤一个数据帧以使其具有与 R 中的另一个数据帧匹配的字段的行?