SKPhysicsWorld在缩放节点中模拟物理

时间:2014-03-12 18:20:36

标签: ios objective-c sprite-kit skphysicsbody sknode

我正在尝试构建一个SpriteKit游戏,该游戏涉及可以放大和缩小的物理实体。物理世界没有像我预期的那样表现,并且当缩放级别改变时会导致奇怪的事情发生。

具有物理实体的节点按照预期动画和运行。放大水平是通过捏合手势来处理的,该手势正在调整单个“世界”节点的比例。其中包含所有游戏元素。这是处理它的一种方便方法,因为缩放场景似乎做了可怕的事情,并且它可以很容易地为世界节点顶部的任何游戏界面元素添加单独的未缩放节点。

缩放的工作原理如下:

- (void) handlePinchGesture:(UIPinchGestureRecognizer *) gesture {
    if (gesture.state == UIGestureRecognizerStateChanged) {
        [self.worldNode runAction:[SKAction scaleBy:gesture.scale duration:0.0]];
        gesture.scale = 1;
    }
}

当处于正常的缩放级别时,一切都很好,并且在视觉上,一切看起来都很好,不同的缩放级别。问题是,当变焦发生变化时,物理体继续以相同的速度移动,速度不是相对于其他物体的速度。结果是当缩小以查看更多场景时,一切都移动得更快。

这似乎是物理世界仅与场景相关并且不知道“世界节点”的调整后的比例这一事实的副作用。物理机构不应该继续在相对空间中以相同的速度移动节点吗?

任何人都可以提供任何有关SpriteKit行为方式或如何解决这个问题的见解吗?

2 个答案:

答案 0 :(得分:2)

它以这种方式表现的原因是显而易见的。想象一下,你想要将球缩放到更小的尺寸,它应该仍然以相同的方式移动吗?

问题出现是因为你缩放"整个球系统"同时。除了正在发生的事情之外,哪个没有任何真正合理的结果。 SpriteKit实际上需要猜测你正在尝试做什么,或者根据它的缩放程度来扩展它的物理速度,或者不用它来缩放物理速度。

解决方案是缩放整个场景而不是子节点。

编辑:要缩放场景,请设置大小。您需要将场景的scaleMode设置为SKSceneScaleModeAspectFill。

Edit2:subcenes解决方案只有在你将它们添加到专用的第二个SKView时才有效,而且我承认它相当遥远。您可能需要使用单个场景,向上和向下缩放,相应地移动子节点并隐藏您的界面元素(或者#34;反缩放它们")。

答案 1 :(得分:1)

这个答案基于@ TheisEgeberg在他的回答评论中建议的方法。做出这个答案,因为我认为它需要回答而不是评论。如果他用这种方法更新他的答案,我将删除这个答案。将这种方法作为问题的答案,将为人们带来许多麻烦。

1.创建一个包含物理节点的SKScene。

2.创建一个充当SKScene模仿的SKNode

3.对于您创建并添加到SKScene的每个节点,您创建另一个模拟节点 - 但没有physicsBody - 并将其添加到模拟SKNode;

4.在SKScene中创建一个名为updateMimicNodes的方法,该方法遍历所有节点并更新模拟节点中相应节点的位置zRotation。从您的更新方法调用该方法,以便每帧都更新。

5.根据需要调整模拟节点。

6.使用隐藏属性隐藏具有物理实体的SKScene节点。如果将所有节点放在SKNode图层上并添加到SKScene,则只需将该SKNode的隐藏属性设置为YES;

为了便于管理,我创建了一个"模仿"我所有节点上的属性,并将该属性设置为模拟节点上的相应节点。然后,您可以像这样更新更新中的每个节点:

node.mimic.position = node.position
node.mimic.zRotation = node.zRotation

我可能稍后会为这种方法发布一些示例代码,但是如果你按照这些步骤进行,你应该到达承诺的土地。

另请注意,任何触摸都需要将位置转换为SKScene与物理机构的坐标系。