【问题标题】:Joints break when zooming缩放时关节断裂
【发布时间】:2014-02-19 19:25:26
【问题描述】:

我最近一直在排练 Sprite Kit,遇到了一个非常奇怪的问题。当缩放父节点时,通过 SKPhysicsJointPin 连接在一起的物体逐渐分开,然后关节断开。让我给你看图片。

这是正常状态:

这是放大后的样子:

这是缩小的时候:

如果你问我如何连接身体:我将棕色棒连接到蓝色节点中心的蓝色节点。任何想法我的问题是什么?

编辑:我最近发现,当连接体不是动态的时,关节不会断裂,并且一切都按预期工作。例如,如果我使用 [SKPhysicsBody bodyWithEdgleLoopF​​romRect] 而不是 [SKPhysicsBody bodyWithRectangleOfSize] 为精灵创建物理体,没有问题。但我需要身体是动态的。

这是我用来将物理连接到节点的代码。当然,这一切都是动态完成的。为了简洁,我只是硬编码。

 -(void)attachPhysics{
    //fixedComponentLeft & fixedComponentRight are two SKSprites
    fixedComponentLeft.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.frame.size.width];
    fixedComponentRight.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.size.width];
    beam1.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam1.size];
    joiningBody.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:joiningBody1.size.width];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentLeft.physicsBody bodyB:beam1.physicsBody anchor:fixedComponentLeft.position]];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin  jointWithBodyA:joiningBody.physicsBody bodyB:beam1.physicsBody anchor:beam1.endPoint]];
    beam2.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam2.size];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin  jointWithBodyA:joiningBody.physicsBody bodyB:beam2.physicsBody anchor:beam2.position]];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentRight.physicsBody bodyB:beam2.physicsBody anchor:beam2.endPoint]];
 }

在上面的代码中,beam1 和beam2 是SKSpriteNode 的子类的实例。默认情况下,锚点是 (0,0.5),我添加了一个名为 endPoint 的属性,它用作精灵上最右边的边缘点。

【问题讨论】:

    标签: physics sprite-kit zooming revolute-joints


    【解决方案1】:

    事实上,这不是一个答案,但我认为我不会为此使用评论区,因为问题大到无法容纳那里。我应该猜到问题是由绘制元素的节点和它们的身体被添加到具有不同坐标系的物理世界引起的。这是因为物理世界属于场景,这意味着无论场景中添加多少子节点,通常只有一个物理世界,所有附着在不同子节点上的不同节点的物体都共享同一个世界。不知道好不好所以我们可以尝试以下方法:

    1. 缩放场景本身而不是子节点:当我尝试它时,毫不奇怪我遇到了一个非常大的问题。由于场景通常是游戏中所有节点的根节点,这意味着一切都会相应地放大或缩小。这也包括控制面板。所以,不是一个好主意

    2. 您可以尝试继承 SKNode 以便它实现自己的 SKPhysicsWrold 实例并将所有内容添加到该世界:不幸的是,由于某些原因,Apple 无法拥有自己的物理世界。是的,您可以将关节添加到您想要的任何世界。但是关节需要身体来共享同一个世界。从纯粹的、未包装的 Box2D 中,我记得身体也需要添加到物理世界中。所以我假设,苹果已经自动完成了,当你设置物理体时,它会被添加到 scene.physicsWorld 中。如果您尝试将关节添加到自定义创建的物理世界,您将收到 Box2D 错误,指出关节容量小于关节数。 :))

    3. 似乎唯一现实的方法是重建物理体和关节。但这是一个真正的痛苦,我也没有成功。除了潜在的性能影响外,这种方法还需要非常准确的身体和关节重新创建顺序,设置它们之前的速度等。

      所以,在网上搜索了 20 多天并没有找到真正可行的解决方案,我可以说这是一个真正的问题,我认为 Apple 需要考虑重新考虑,或者至少提供好的解决方案。

    【讨论】:

      【解决方案2】:

      我不确定您的代码是什么样的,但我遇到了类似的问题,我在平台游戏(想想超级马里奥)中有一根绳子,使用瓷砖地图,如果我在开头添加了绳子关卡一切正常,关节之间的结合力保持不变,但是当我把绳子放在关卡的中间或末端时,关节会变得更有弹性,绳子会断裂,同时发送物理世界陷入无限循环,一切都停止了。

      修复结果很简单,正如你所说,物理世界属于场景,只有场景本身,我将绳索添加到基于节点位置的位置,这实际上导致了问题。

      当我使用时

       CGPoint positionInScene = [self convertPoint:nodeB.position  fromNode:self.map];
      

      以下代码将节点的位置转换为场景的坐标,然后使用该 positionInScene 变量将关节作为锚点附加到,如下所示:

      [SKPhysicsJointFixed jointWithBodyA: nodeA.physicsBody
                                    bodyB: nodeB.physicsBody
                                   anchor: CGPointMake(positionInScene.x, positionInScene.y)];
      

      一切都开始正常工作。

      所以在你的情况下,如果你能展示你使用的代码,也许我们可以解决类似的问题。 希望这会有所帮助。

      【讨论】:

      • 感谢@Andrew 的洞察力。我添加了一些代码。
      • 在设置锚点位置时,您是否尝试在锚点位置使用 [yourScene convertPoint:fromNode:]?
      • 我只是在你的建议下才这样做的,事实上我之前可能已经尝试过。但这无济于事
      【解决方案3】:

      在平移世界中遇到过类似问题。

      世界坐标不再与物理坐标匹配。

      所以你必须使用对 [scene convertPoint:pt fromNode:pannedWorld] 的调用。

      我已经覆盖了 applyForce:atPoint: 和 applyTorque:atPoint: 来抽象它并确保代码保持清晰。

      我还发现,如果您在 didBeginContact: 中将对象添加到场景中:(例如爆炸产生的弹片),那么创建的任何对象都需要在绝对物理世界坐标系中指定坐标,而不是相对平移/缩放世界。

      实际上,所有事物的行为都好像 PhysicsWorld 是一个绝对且不可变的坐标系,而 SKNode 视图正是如此,物理世界的视图,并且可以平移等。 令人困惑的是,在大多数情况下,坐标会从一个系统透明地转换到另一个系统,但并非总是如此。

      【讨论】:

      • 感谢您的意见,但我开始意识到 Sprite Kit 仍然不成熟,存在许多妨碍制作尖端游戏的错误/预期行为。所以我回到了旧的 Cocos2D。现在使用 V3 将物理集成到其中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多