SpriteKit Physics关联移动场景会损坏

时间:2016-01-27 08:10:27

标签: ios sprite-kit game-physics

我用物理机身创建了一个SpriteKit场景。这工作得很好。我也在使用带有“相机节点”的Apple最佳实践来滚动场景。

我的场景节点树是这样的:

Scene
|- World
   |- Camera node
   |- Game nodes with physics bodys

我的问题是,在游戏中我动态地创建了具有新关节(大多数是固定关节)的新节点。此时,世界节点的位置与开头不同(例如:在开始时(0,0),在游戏期间(1000,500)..) 现在,固定关节的锚点不在我想要的位置,它在场景中的某个位置。

我假设,场景的坐标系与物理引擎的坐标系不同。

对于锚点,我使用以下转换:

[world.scene convertPoint:node.position fromNode:node.parent];

我想将anchorpoint设置在“node”的位置。 移动世界节点后,锚点的计算不再起作用。

感谢您的帮助!

Greetz - Nekro

更新

播放器中心场景的代码

- (void)centerOnNode:(SKNode*)node {
    CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];
    node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x, node.parent.position.y - cameraPositionInScene.y);
}

1 个答案:

答案 0 :(得分:0)

使用SpriteKit物理关节有两个要求:

  1. 定义世界(场景)空间中的关节。
  2. 不要移动世界。
  3. 从你的问题和评论中,听起来你的#1是正确的:当关节位于不是场景的直接子节点的节点之间时,你需要将坐标转换为场景空间,然后再使用它们来定义接头。

    但是,当您尝试移动根坐标系时,SpriteKit物理不能很好地处理它。因此,通过移动世界来实现“相机”会给关节带来麻烦。代替:

    • 如果你能够只定位iOS 9.0 / OS X 10.11 / tvOS 9.0及以上,请使用SKCameraNode而不是移动世界。它也更容易!

      (如果您想知道是否只能支持iOS 9,请查看adoption rate statistics,并与您的开发时间表进行比较...如果您暂时无法发货,iOS 9在您完成时可能是“-1”操作系统版本。请记住,热心客户和早期采用者之间也存在很高的相关性。)

    • 如果您仍在支持iOS 8 / OS X 10.10,请尝试在场景中添加额外的图层:通过移动场景中的节点和所有游戏内容的父节点来伪造相机