如何计算弯曲的 SKSpriteNode 的 "center" 点?
How to calculate the "center" point of a curved SKSpriteNode?
我正在通过 SKShapeNode 的纹理初始化和显示 SKSpriteNode,该纹理具有代表圆的一部分的特定路径。下面是我使用 playground 生成的形状示例:
import SpriteKit
import PlaygroundSupport
let view = SKView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let scene = SKScene(size: view.frame.size)
view.presentScene(scene)
let radius: CGFloat = view.frame.width * 0.40
var length: CGFloat = (.pi * 2.0) / 8.0
var width: CGFloat = radius / 5.0
var path: CGPath {
let path = UIBezierPath(arcCenter: view.center, radius: radius, startAngle: 0.0, endAngle: length, clockwise: true)
path.addArc(withCenter: view.center, radius: radius - width, startAngle: length, endAngle: 0.0, clockwise: false)
path.close()
return path.cgPath
}
let shapeNode = SKShapeNode(path: path)
shapeNode.fillColor = .white
let texture = view.texture(from: shapeNode)!
let spriteNode = SKSpriteNode(texture: texture, color: .white, size: texture.size())
spriteNode.position = CGPoint(x: shapeNode.frame.midX, y: shapeNode.frame.midY)
scene.addChild(spriteNode)
PlaygroundPage.current.liveView = view
这会生成这个形状:
我想添加一个小的子 SKSpriteNode,它在弯曲节点的宽度内居中,位于中间的圆弧点,如下所示:
我最接近的是使用 spriteNode 的位置:
let childNode = SKSpriteNode(color: .red, size: CGSize(width: 5, height: 5))
childNode.position = spriteNode.position
scene.addChild(childNode)
这产生了一些接近的东西,但它使用的是框架,这是完全错误的:
我假设我需要对弧的路径做一些事情,但我不确定如何做。有人能给我指出正确的方向吗?
感谢评论,我避免使用路径并刷新一些基本的触发来解决:
let x = (radius - width/2) * cos(length/2) + view.center.x
let y = (radius - width/2) * sin(length/2) + view.center.y
childNode.position = CGPoint(x: x, y: y)
我正在通过 SKShapeNode 的纹理初始化和显示 SKSpriteNode,该纹理具有代表圆的一部分的特定路径。下面是我使用 playground 生成的形状示例:
import SpriteKit
import PlaygroundSupport
let view = SKView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let scene = SKScene(size: view.frame.size)
view.presentScene(scene)
let radius: CGFloat = view.frame.width * 0.40
var length: CGFloat = (.pi * 2.0) / 8.0
var width: CGFloat = radius / 5.0
var path: CGPath {
let path = UIBezierPath(arcCenter: view.center, radius: radius, startAngle: 0.0, endAngle: length, clockwise: true)
path.addArc(withCenter: view.center, radius: radius - width, startAngle: length, endAngle: 0.0, clockwise: false)
path.close()
return path.cgPath
}
let shapeNode = SKShapeNode(path: path)
shapeNode.fillColor = .white
let texture = view.texture(from: shapeNode)!
let spriteNode = SKSpriteNode(texture: texture, color: .white, size: texture.size())
spriteNode.position = CGPoint(x: shapeNode.frame.midX, y: shapeNode.frame.midY)
scene.addChild(spriteNode)
PlaygroundPage.current.liveView = view
这会生成这个形状:
我想添加一个小的子 SKSpriteNode,它在弯曲节点的宽度内居中,位于中间的圆弧点,如下所示:
我最接近的是使用 spriteNode 的位置:
let childNode = SKSpriteNode(color: .red, size: CGSize(width: 5, height: 5))
childNode.position = spriteNode.position
scene.addChild(childNode)
这产生了一些接近的东西,但它使用的是框架,这是完全错误的:
我假设我需要对弧的路径做一些事情,但我不确定如何做。有人能给我指出正确的方向吗?
感谢评论,我避免使用路径并刷新一些基本的触发来解决:
let x = (radius - width/2) * cos(length/2) + view.center.x
let y = (radius - width/2) * sin(length/2) + view.center.y
childNode.position = CGPoint(x: x, y: y)