如何从SWIFT中的SKSpriteNode创buildCGPath
我有一个SKSpriteNode与电平生成器创build。
我需要使用CGPath创build完全相同的形状。
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 position(52.8359451293945,-52.9375076293945)
为了检查我的CGPath是否已经创build,我用CGPath创build了一个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
编辑 :
我也看到你的anchorPoint被设置为(0.0,0.0),但是默认的锚点是(0.5,0.5)。 尝试纠正这个参数来匹配你的sks。
你的尺寸布局可能和场景不一样,所以:
scene.size = skView.bounds.size
在展示你的场景之前,请看一下这个参数的改变:
scene.scaleMode = .ResizeFill
实际上,缩放模式也影响到定位。
什么是scaleMode ?
场景的scaleMode决定如何在iOS设备旋转时更新场景以填充视图。 有四种不同的scaleModes定义:
SKSceneScaleModeFill – x轴和y轴分别放大或缩小,以便场景填充视图。 场景的内容不会保持当前的宽高比。 如果不为场景指定scaleMode,则这是默认值。
SKSceneScaleModeAspectFill – 计算x和y比例因子。 将使用更大的比例因子。 这确保视图将被填充,但通常会导致部分场景被裁剪。 场景中的图像通常会放大,但会保持正确的宽高比。
SKSceneScaleModeAspectFit – 计算x和y比例因子。 较小的比例因子将被使用。 这确保整个场景可见,但通常情况下会导致场景信箱。 场景中的图像通常会缩小,但会保持正确的宽高比。
SKSceneScaleModeResizeFill – 场景不缩放。 它只是resize,以使其符合观点。 由于场景不缩放,图像将保持其原始大小和宽高比。 内容将全部保持相对于场景原点(左下angular)。
我find了一个解决scheme,我需要使用SKShapeNode(path :,居中:) ,然后应用转换并设置位置。
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)。