关于SKSpriteNode定位与UIBezierPath的CGRect坐标疑问
SpriteNode定位与UIBezierPath坐标匹配问题解析
你当前的核心问题是混淆了SpriteKit坐标系和UIKit坐标系的差异,导致用CGRect创建UIBezierPath时y坐标计算错误,下面分情况明确正确的计算方式:
坐标系差异梳理
- SpriteKit:原点在屏幕中心,y轴向上;
myTracks的anchorPoint设为(0.5,0.5),所以它的position是节点的中心坐标。 - UIKit:原点在屏幕左上角,y轴向下;
CGRect的y值是矩形左上角的纵坐标,矩形向下延伸。
情况1:UIBezierPath用于UIKit场景
要让路径和myTracks位置完全匹配,需要先把SpriteKit的中心坐标转换为UIKit坐标系:
- 把SpriteKit中
myTracks的中心y坐标tracksPosY转成UIKit坐标:
(SpriteKit的y=0对应UIKit的屏幕中心,即let uikitCenterY = roomHeight/2 - tracksPosYroomHeight/2,SpriteKit中向上的y值在UIKit中会对应更小的纵坐标) - 计算UIKit矩形左上角的y值(中心y减去矩形高度的一半):
let rectY = uikitCenterY - tracksHeight/2 - 代入你原有的
tracksPosY计算式tracksPosY = -roomHeight/2 + trackOffset + tracksHeight/2,可以简化得到:
你提到的rectY = roomHeight - trackOffset - tracksHeighty: tracksPosY + tracksHeight/2是错误的,因为没有考虑坐标系翻转,会导致路径位置完全颠倒。
情况2:UIBezierPath用于SpriteKit场景(比如作为SKShapeNode的路径)
SpriteKit中的CGRect遵循自身坐标系(原点在矩形左下角,y轴向上),要匹配myTracks的位置,trackRect的y值应该是节点中心向下偏移半高的位置:
trackRect = CGRect(x: tracksPosX - tracksWidth/2, y: tracksPosY - tracksHeight/2, width: tracksWidth, height: tracksHeight)
内容的提问来源于stack exchange,提问作者user22530416
相关产品推荐
相关产品推荐

