SKShapeNode创建后位置不一致问题求助
SpriteKit中SKShapeNode的position与路径坐标的区别
你混淆了SKShapeNode.position属性和路径坐标的作用:
position是节点在父节点(如场景)坐标系中的位置,默认值就是(0,0),不会自动跟随路径的起点坐标,除非你主动设置它。- 你创建的路径(起点(-1,-1)、终点(1,1))是相对于SKShapeNode自身坐标系的坐标,和节点在场景中的位置是两个独立的概念。锚点(0.5,0.5)决定了节点自身坐标系的中心会对齐到
position的位置。
如何实现你想要的效果
如果你希望线条的起点对应场景中的(-1,-1),可以通过两种方式调整:
方式1:锚点保持(0.5,0.5),让节点position对应路径中心
这种方式下,节点的position会是路径的中心位置,确保线条整体在场景中正确显示:
import SpriteKit func buildLine(x0: CGFloat, y0: CGFloat, x1: CGFloat, y1: CGFloat) -> SKShapeNode { let line = SKShapeNode() line.anchorPoint = CGPoint(x: 0.5, y: 0.5) // 计算路径在场景中的中心坐标 let centerX = (x0 + x1) / 2 let centerY = (y0 + y1) / 2 // 生成相对于节点中心的路径坐标 let path = CGMutablePath() path.move(to: CGPoint(x: x0 - centerX, y: y0 - centerY)) path.addLine(to: CGPoint(x: x1 - centerX, y: y1 - centerY)) line.path = path line.position = CGPoint(x: centerX, y: centerY) // 设置节点位置为路径中心 return line } class GameScene: SKScene { override func didMove(to view: SKView) { let line = buildLine(x0: -1, y0: -1, x1: 1, y1: 1) print(line.position) // 输出(0.0, 0.0),即路径中心,此时线条起点在场景(-1,-1) addChild(line) } }
方式2:修改锚点为(0,0),让节点position对应路径起点
这种方式下,节点的position会直接对应场景中的起点坐标,路径从节点自身原点开始绘制:
import SpriteKit func buildLine(x0: CGFloat, y0: CGFloat, x1: CGFloat, y1: CGFloat) -> SKShapeNode { let line = SKShapeNode() line.anchorPoint = CGPoint(x: 0, y: 0) // 锚点设为节点自身左下角 let path = CGMutablePath() path.move(to: .zero) // 路径起点相对于节点自身原点 path.addLine(to: CGPoint(x: x1 - x0, y: y1 - y0)) // 终点为相对起点的偏移量 line.path = path line.position = CGPoint(x: x0, y: y0) // 节点位置设为场景中的起点坐标 return line } class GameScene: SKScene { override func didMove(to view: SKView) { let line = buildLine(x0: -1, y0: -1, x1: 1, y1: 1) print(line.position) // 输出(-1.0, -1.0),符合你的预期 addChild(line) } }
核心总结
SKShapeNode的position和路径坐标没有绑定关系,默认值为(0,0)。- 路径坐标是节点自身坐标系内的相对位置,锚点决定了节点自身坐标系的哪个点会对齐到
position。 - 要让线条显示在场景的指定位置,需要根据锚点,协调路径坐标和
position的取值。
内容的提问来源于stack exchange,提问作者L.B.
相关产品推荐
相关产品推荐

