首页 文章

SKPhysicsWorld在缩放节点中模拟物理

提问于
浏览
3

我正在尝试构建一个SpriteKit游戏,它涉及物理体的水平,可以放大和缩小 . 物理世界的行为并不像我预期的那样,并且当缩放级别改变时会导致奇怪的事情发生 .

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

缩放的工作原理如下:

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

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

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

任何人都可以提供任何洞察SpriteKit行为方式的原因,或者如何解决这个问题?

2 回答

  • 1

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

    出现此问题的原因是您同时缩放“整个球系统” . 除了正在发生的事情之外,没有任何真正明智的结果 . SpriteKit实际上需要猜测你正在尝试做什么,或者根据它的缩放程度来使其工作,或者根据它来缩放物理速度 .

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

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

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

  • 2

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

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

    2.创建一个SKNode,它将充当您对SKScene的模仿

    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与物理主体的坐标系 .

相关问题