SKSpriteNode 不会居中

Posted

技术标签:

【中文标题】SKSpriteNode 不会居中【英文标题】:SKSpriteNode will not center 【发布时间】:2016-10-13 21:43:35 【问题描述】:

我的 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 不在它应该在的位置,它在右边几个:

但是当我添加我创建的 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)

它显示它也具有相同的框架:

【问题讨论】:

我的第一个猜测是帧大小的变化,当从形状转换为纹理时,你抓取的可能比你想象的要大 @Knight0fDragon 我应该打印框架,看看它的大小是否相同? 将背景显示为精灵时,只需将其设置为白色,您应该会看到比您预期的更黑 哦...在你的 SKShapeNode 上放一个黑色方块,填满屏幕 lol 对不起,我累了,我告诉你的行不通,只需将纹理大小的黄色 SKSpriteNode 添加到你的精灵,而不是形状。 let test = SKSpriteNode(color:SKColor.yellow, size:sprite.size);spr.zPosition = -1; sprite.addChild(spr); 【参考方案1】:

经过长时间的讨论,我们确定问题是由于框架尺寸不是形状的预期尺寸。

为了解决这个问题,OP 创建了他原始路径的外部路径,并计算了围绕它的框架。现在这种方法可能并不适合所有人。

如果其他人遇到此问题,他们将需要执行以下操作:

1) 检查 SKShapeNode 的框架,确保它是正确的 2) 确定哪种方法最适合计算正确的所需帧 3) 获取textureFromNode 时使用这个新帧只提取所需的纹理大小

【讨论】:

以上是关于SKSpriteNode 不会居中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SKPhysicsBody(texture: size:) 居中于 SKSpriteNode 锚点以外的点

表格不会使用 flexbox 垂直居中 [重复]

还不会CSS水平垂直居中?这里有12种方案

导航栏不会以常规 CSS 设置居中

让textArea的placeholder垂直居中,输入文字时不会居中

谷歌地图不会居中