给SKSpriteNode添加SKPhysicsBody后位置异常,如何正确居中物理体?
解决SKPhysicsBody与SKSpriteNode位置错位的问题
你的问题核心在于锚点(anchorPoint)和物理体中心的匹配关系,我来帮你拆解原因和解决办法:
为什么会出现偏移?
你把mBorder.anchorPoint设置成了CGPoint(x: 0, y: 0)(节点的左下角),但使用SKPhysicsBody(rectangleOf:)创建物理体时,默认是将节点的锚点作为物理体的中心。这就导致物理体的中心落在了节点的左下角,而你的节点图形是从左下角开始绘制的,最终物理体和图形出现错位,连调试线都无法对齐。
两种解决方法
方法1:调整物理体的中心以匹配锚点(0,0)
如果你想保留锚点(0,0)的设置,创建物理体时需要显式指定物理体的中心,让它和节点图形的中心重合。因为节点锚点在左下角,物理体的中心应该是图形宽高的一半:
// 替换原来的物理体创建代码 let borderSize = CGSize(width: myGlobalVars.widthPoints, height: myGlobalVars.heightPoints * 0.01) mBorder.physicsBody = SKPhysicsBody(rectangleOf: borderSize, center: CGPoint(x: borderSize.width/2, y: borderSize.height/2)) mBorder.physicsBody!.affectedByGravity = false
方法2:使用默认锚点,调整节点位置
SpriteNode默认的锚点是(0.5, 0.5)(图形中心),这种情况下物理体创建时会自动和图形居中对齐,不需要额外调整物理体。你只需要重新计算节点的position来达到预期位置:
原来的position是(0, 0.2*height)(锚点0,0时对应图形左下角坐标),改成锚点0.5,0.5后,position应该是图形中心的坐标:
// 移除锚点设置,保持默认的(0.5,0.5) // mBorder.anchorPoint = CGPoint(x: 0, y: 0) let borderHeight = myGlobalVars.heightPoints * 0.01 mBorder.position = CGPoint(x: myGlobalVars.widthPoints/2, y: myGlobalVars.heightPoints * 0.2 + borderHeight/2) // 正常创建物理体即可 mBorder.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: myGlobalVars.widthPoints, height: borderHeight)) mBorder.physicsBody!.affectedByGravity = false
验证效果
不管用哪种方法,开启view.showsPhysics = true后,物理调试线应该会和你的红色边框完全重合,节点的位置也会和你预期的一致。
内容的提问来源于stack exchange,提问作者Caractacus
相关产品推荐
相关产品推荐

