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) .
我用关卡生成器创建了一个 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) .