【问题标题】:Merge several physics bodies合并几个物理体
【发布时间】:2017-02-07 07:07:40
【问题描述】:

我正在尝试将几个精灵节点合并到一个统一的物理体中。例如:

我正在尝试将这三个障碍统一到一个精灵节点中。我查看了其他问题,并尝试了以下方法:

  • 将其中一个节点设为父节点,将其他节点添加到父节点并将它们设置为非动态。但是,这会禁用子节点的移动。

  • 我尝试使用所有其他障碍的物理体创建一个节点:

    SKPhysicsBody(bodies: self.allNodePhysicsBodies)
    
  • 我还尝试使用“父”节点创建节点的联合:

    let joint = SKPhysicsJointFixed.joint(withBodyA: merge[0].physicsBody!, bodyB: merge[1].physicsBody!, anchor: CGPoint(x: 0, y: 0))
    let joint1 = SKPhysicsJointFixed.joint(withBodyA: merge[0].physicsBody!, bodyB: merge[2].physicsBody!, anchor: CGPoint(x: 0, y: 0))
    
    
    self.physicsWorld.add(joint1)
    self.physicsWorld.add(joint)
    

    然而,这并没有将物理实体联合起来。它不会创建单个物理体。

我怎样才能做到这一点?我在想我唯一的选择是在创建节点之前合并纹理。

编辑

尝试再次将屏障与物理体结合:

    let ourUnionOfBodies = SKPhysicsBody(bodies: [merge[0].physicsBody!, merge[1].physicsBody!, merge[2].physicsBody!])
    ourUnionOfBodies.isDynamic = true

    merge[2].physicsBody = ourUnionOfBodies

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    init(bodies: [SKPhysicsBody])

    这就是你需要的。

    但是,您在使用它时似乎做错了什么。我假设您忘记了将新创建的物理体的属性设置为与您的世界和其中的其他对象交互所需的属性。

    我会犯同样的错误,因为我假设联合体的所有属性都会被新体采用,特别是如果它们都相同的话。但事实并非如此。

    来自文档:

    子项的属性,例如质量或摩擦力,将被忽略。 仅使用子实体的形状。

    因此,从数组中的实体的联合创建了新实体后,现在您需要根据需要手动设置该实体的所有属性。

    例如。

    // Putting the right bodies together, correctly
    
    let ourUnionOfBodies = SKPhysicsBody(bodies: [bodyMine, bodyBeyonce])
    ourUnionOfBodies.isDynamic = YES!
    
    // and the result = TWINS!
    

    【讨论】:

    • 你能比“它不起作用......”@pablo 更详细一点吗?你没有给我任何继续。
    • 我很抱歉我缺乏细节。所以我将“ourUnionOfBodies”应用于第一个节点,但它仍然保留了它的原始主体,它没有所有三个节点的主体。我已将我的代码粘贴到我的答案底部的“编辑”部分。
    • 好吧,你把身体放在一起的方式有问题,或者你正在做的其他方面有问题。这应该有效。这个初始化的明确目的是从多个主体中创建一个主体。它没有其他目的...话虽如此...我建议开始一个空白项目,并制作几个正方形作为主体,然后将它们联合起来,以确保它确实有效。 SpriteKit 中存在错误。 @巴勃罗
    • 您查看我当前的代码了吗?它看起来不正确还是可能是代码的另一部分?
    • 是的,很可能是您的其他代码。您必须从原始物理实体中“复制”您想要的所有设置。这包括类别和其他所有内容,因此新的工会机构的运作方式与成立工会之前的机构相同。
    【解决方案2】:

    您可以在 CGMutablePath 内绘制障碍物,然后将其用作一个节点的物理体,尽管这需要一些长时间的工作。

    let bodyPath = CGMutablePath()
    bodyPath.move(to: CGPoint(x: ..., y: ...)) // Use move(to:) to “move the pen” somewhere without “drawing”
    bodyPath.addLine(to: CGPoint(x: ..., y: ...)) // Use addLine(to:) to trace a line starting from the “pen”’s last position to the specified CGPoint position
    // ...
    physicsBody = SKPhysicsBody(polygonFrom: bodyPath)
    

    【讨论】:

    • 但是一个节点会有3个节点的主体?而另外两个保留各自的身体。
    • 是的,您可以将其他 2 个节点的物理体设置为零。我对您的问题唯一不太了解的部分是您对这 3 个障碍的期望是什么类型的行为。假设您希望所有 3 个障碍一起移动,您可以通过参考主节点的位置来更新覆盖 func update(...) 内部的外部障碍的位置(没有物理实体的障碍)。希望我的回答很清楚,如果有帮助,请告诉我。
    • 好的,所以你建议让中间节点有身体,而外部节点没有身体,但每帧更新它们的位置以模拟中间节点正在接收的向量?
    • 是的。通过使用 CGMutablePath,您可以绘制出最适合您需求的physicsBody。
    • 我只是担心根据中间节点的位置更新它们可能会导致微小但明显的差异。例如,如果中间节点随着向量移动,我不确定将其他两个节点从中间节点的位置定位是否足够准确。
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2016-09-22
    相关资源
    最近更新 更多