ios SKSpriteNode不会居中

lvjbypge  于 12个月前  发布在  iOS
关注(0)|答案(2)|浏览(122)

我在我的GameScene中有这个,在didMove()中被称为

for i in 1...5 {

    // path to create the circle
    let path = UIBezierPath(arcCenter: CGPoint(x: center.x, y: center.y), radius: CGFloat(((43 * i) + 140)), startAngle: CGFloat(GLKMathDegreesToRadians(-50)), endAngle: CGFloat(M_PI * 2), clockwise: false)

    // the inside edge of the circle used for creating its physics body
    let innerPath = UIBezierPath(arcCenter: CGPoint(x: center.x, y: center.y), radius: CGFloat(((43 * i) + 130)), startAngle: CGFloat(GLKMathDegreesToRadians(-50)), endAngle: CGFloat(M_PI * 2), clockwise: false)

    // create a shape from the path and customize it
    let shape = SKShapeNode(path: path.cgPath)
    shape.lineWidth = 20
    shape.strokeColor = UIColor(red:0.98, green:0.99, blue:0.99, alpha:1.00)

    // create a texture and apply it to the sprite
    let trackViewTexture = self.view!.texture(from: shape)
    let trackViewSprite = SKSpriteNode(texture: trackViewTexture)
    trackViewSprite.physicsBody = SKPhysicsBody(edgeChainFrom: innerPath.cgPath)
    self.addChild(trackViewSprite)

}

字符串
它使用UIBezierPaths来做几个圆。它将路径转换为SKShapeNode,然后转换为SKTexture,然后将其应用于最终的SKSpriteNode。
当我这样做时,SKSpriteNode不在它应该在的地方,它是右边的几个:
x1c 0d1x的数据
但是当我添加我创建的SKShapeNode时,它被设置得非常好:



即使这样做也不能使它居中!

trackViewSprite.position = CGPoint(x: 0, y: 0)


不管我怎么试,它就是不居中。
为什么会发生这种情况?转换为纹理时出现了某种错误?
P.S -这也与此有关Keep relative positions of SKSpriteNode from SKShapeNode from CGPath,但也没有回应:(
编辑,当我运行这个:

let testSprite = SKSpriteNode(color: UIColor.yellow, size: trackViewSprite.size)
self.addChild(testSprite)


它显示它也有相同的帧:

l5tcr1uw

l5tcr1uw1#

经过长时间的讨论,我们确定问题是由于帧大小不是形状的预期大小。
为了解决这个问题,OP创建了一个原始路径的外部路径,并计算了将围绕它的框架。现在这种方法可能不适用于每个人。
如果其他人遇到这个问题,他们将需要做这些事情:
1)检查SKShapeNode的框架以确保其正确
2)确定哪种方法最适合计算正确的所需帧
3)在获取textureFromNode时使用此新帧仅提取所需的纹理大小

jv4diomz

jv4diomz2#

我只是偶然遇到了这个问题,并解决了它类似于公认的答案-但我注意到,似乎node.calculateAccumulatedFrame()并不总是正确计算高斯模糊,并经常剪切模糊-这看起来很可怕。
1.使用最大尺寸使其为正方形
1.如果使用模糊将最大尺寸增加10%(不确定这是否有帮助-某些东西正在视图中剪切我的模糊?.texture(fromNode))
1.根据最大尺寸剪裁(视图尺寸)
Sudo代码:

let texBounds = shapeNode.calculateAccumulatedFrame()
var largestDim = max(texBounds.width, texBounds.height) * 1.1
let viewDim = max(view!.bounds.width, view!.bounds.height)
largestDim = min(largestDim, viewDim)
let cropBounds = CGRect(x: -1.0 * largestDim, y: -1.0 * largestDim, width: largestDim * 2, height: largestDim * 2)
let tex = view?.texture(from: alphaNode, crop: cropBounds)
texNode = SKSpriteNode(texture: tex)

字符串

相关问题