SWIFT 如何从 SKSpriteNode 创建 CGPath

How to create CGPath from a SKSpriteNode in SWIFT

我用关卡生成器创建了一个 SKSpriteNode。

我需要使用 CGPath 创建完全相同的形状。

   self.firstSquare = childNodeWithName("square") as! SKSpriteNode

   var transform = CGAffineTransformMakeRotation(self.firstSquare.zRotation)
   let rect = CGRect(origin: self.firstSquare.position, size: self.firstSquare.size)
   let firstSquareCGPath:CGPath=CGPathCreateWithRect(rect, &transform)
   print(self.firstSquare.position)

=> firstSquare 位置 (52.8359451293945, -52.9375076293945)

为了检查我的 CGPath 是否已按照我的需要创建,我用我的 CGPath 创建了一个 SKShapeNode:

let shape:SKShapeNode=SKShapeNode(path:path)
shape.fillColor = self.getRandomColor()
addChild(shape)
print(shape.position)

=> 形状​​位置 (52.8359451293945, -52.9375076293945)

结果不是我所期望的。

所以我不知道是我的CGPath错了,还是我在SKShapeNode中转换它的时候丢失了初始精灵属性。

要了解我为什么需要这样做,请阅读

编辑 1,2

我补充说:

shape.position = self.firstSquare.position

我得到了:

编辑 3:

我更新了上面的解释,我的 firstSquare 的锚点现在是 (0.5, 0.5)

通常我不使用.SKS文件,我更喜欢只写代码,但这里似乎只有两个方块,一个是原来的.sks位置,另一个是第二次添加的,没有任何位置。

如果您想简单地叠加第一个方块:

shape.position = self.firstSquare.position

编辑:

我还看到你的锚点设置为 (0.0,0.0) 但默认锚点是 (0.5,0.5)。尝试更正此参数以匹配您的 sks。

您的.sks尺寸布局可能与场景不一样,所以:

scene.size = skView.bounds.size

在展示场景之前,请同时查看此参数以进行更改:

scene.scaleMode = .ResizeFill 

其实缩放模式对定位也有影响

What is scaleMode?

场景的 scaleMode 决定了当 iOS 设备旋转时场景将如何更新以填充视图。定义了四种不同的 scaleModes:

SKSceneScaleModeFill – x 轴和 y 轴分别按比例放大或缩小,以便场景填充视图。场景的内容将不会保持其当前的纵横比。如果您没有为场景指定 scaleMode,则这是默认值。

SKSceneScaleModeAspectFill – 计算 x 和 y 比例因子。将使用较大的比例因子。这确保视图将被填充,但通常会导致部分场景被裁剪。场景中的图像通常会按比例放大,但会保持正确的纵横比。

SKSceneScaleModeAspectFit – 计算 x 和 y 比例因子。将使用较小的比例因子。这确保整个场景都可见,但通常会导致场景被信箱化。场景中的图像通常会按比例缩小,但会保持正确的纵横比。

SKSceneScaleModeResizeFill – 场景未缩放。它只是调整大小以适合视图。由于场景未缩放,因此图像将全部保持其原始大小和纵横比。内容将全部保持相对于场景原点(左下)。

我找到了解决方案,我需要使用SKShapeNode(path:, centered:),然后应用转换并设置位置。

self.firstSquare = childNodeWithName("square") as! SKSpriteNode

let firstSquareCGPath:CGPath=CGPath(rect: CGRect(origin: self.firstSquare.position, size: self.firstSquare.size), transform: nil)

let shape:SKShapeNode=SKShapeNode(path: firstSquareCGPath, centered: true) //important
shape.zRotation = self.firstSquare.zRotation
shape.position = self.firstSquare.position
shape.fillColor = SKColor.blue()
addChild(shape)

完美运行!

只是一个悬而未决的问题,因为我最后设置了转换和位置(因为SKShapeNode属性),我不知道我上面的CGPath设置是否正确(比如我的SKSpriteNode) .