SpriteKit物理关节移动场景时出现错误

12

我已经使用物理体创建了一个SpriteKit场景,目前运行良好。同时,我也按照苹果的最佳实践方法,通过“相机节点”对场景进行滚动。

我的场景节点树如下:

Scene
|- World
   |- Camera node
   |- Game nodes with physics bodys
我的问题是,在游戏过程中,我动态地创建新的节点和新的关节(主要是固定关节)。此时,世界节点的位置与一开始不同(例如:开始时为(0,0),游戏进行中为(1000,500))。 现在,固定关节的锚点不在我想要的位置,而是在场景中的某个位置。
我猜测,场景的坐标系统与物理引擎的坐标系统不同。
对于锚点,我使用以下转换:
[world.scene convertPoint:node.position fromNode:node.parent];

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

感谢您的帮助!

问候 - 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);
}

@0x141E 很抱歉,我更新了我的文本。在游戏节点中,节点是与相机节点并行添加的,而不是作为相机节点的子节点。奇怪的是,如果我激活SpriteKit场景的物理可视化,偶尔会出现连接到我的中心玩家节点的关节... 我已经设置了断点,只有在创建关节的唯一函数中才运行,但看起来这个路径从未运行过这个“幽灵关节”... - Nuker
只是为了确保:您的物理实体是否使用场景坐标连接,而不是节点的坐标? - Coldsteel48
@Nuker 看起来你从世界坐标转换到场景坐标的方法是正确的,但是...我建议你尝试使用[world convertToPoint:node.position toNode:world.parent]。另外,请确保node.position是以世界坐标表示的(应该是),并且设置了collisionBitMask,以确保这两个物体不会发生碰撞。 - 0x141E
今晚我将尝试并发布一张截图。我已经激活了该功能,就在这时,我看到了这个“鬼线”,它是由一个突然的连接出现后移动造成的。正如我所说,我正在玩家移动时按需加载新节点,但节点的创建始终是相同的过程,因此与最初的创建和“按需创建”没有任何区别。 - Nuker
我将尝试拍摄一个简短的视频,以最好地描述我的问题。为了使世界节点居中,我使用以下代码(我认为也来自Apple Docs..)`- (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);}` - Nuker
显示剩余7条评论
1个回答

1

使用SpriteKit物理引擎连接节点有两个要求:

  1. 在世界(场景)空间中定义连接点。
  2. 不要移动世界。

根据您的问题和评论,似乎您已经正确完成了第一个要求:当连接点位于不是场景的直接子节点之间时,您需要将坐标转换为场景空间,然后再使用它们来定义连接点。

然而,当您尝试移动根坐标系统时,SpriteKit物理引擎无法很好地处理它。因此,通过移动世界来实现“相机”会对连接点造成麻烦。相反:

如果您只需要支持 iOS 9.0 / OS X 10.11 / tvOS 9.0 或更高版本,建议使用 SKCameraNode 来代替移动整个世界。这样做也更加简单!如果您正在考虑是否支持仅 iOS 9 版本,请查看 采用率统计数据 并将其与您的开发计划进行比较... 如果您不会立即发布,iOS 9 可能在您完成时成为“-1”版本。请记住,热情的客户和早期采用者之间有很高的相关性。

  • 如果您仍然需要支持 iOS 8 / OS X 10.10,请尝试向场景添加一个额外的层:通过移动一个节点来伪造相机,该节点是您场景的子级并包含所有游戏内容的父级。


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接