Swift SKScene中移动的SKSpriteNode position始终返回0,0问题求助
问题根源
你遇到的是变量作用域覆盖问题:
- 你在GameScene类顶层已经声明了成员变量
var ship1 = SKSpriteNode() - 但在
didMove(to:)方法里,你又用let ship1 = SKSpriteNode(imageNamed: "ship.PNG")重新声明了一个局部同名变量,你添加到场景里、设置了位置和物理体的都是这个局部变量,类的成员变量ship1始终没有被赋值,它还是你初始化的那个空节点,默认坐标就是(0,0),所以打印时自然一直输出0,0。
修复方案
只需要把didMove里的局部变量声明去掉即可,修改后的对应代码如下:
public override func didMove(to view: SKView) { // gravity edge around screen for convenience physicsBody = SKPhysicsBody(edgeLoopFrom: frame) //turn off default 1g gravity physicsWorld.gravity = .zero //Add a ship sprite 这里去掉let,直接给成员变量ship1赋值 ship1 = SKSpriteNode(imageNamed: "ship.PNG") ship1.setScale(0.2) ship1.position = CGPoint(x: screenW * 0.2, y: screenH * 0.2) ship1.physicsBody = SKPhysicsBody(rectangleOf: ship1.size) ship1.physicsBody?.velocity = CGVector(dx: 0, dy: 100) addChild(ship1) }
修改之后再打印ship1.position就能拿到和触摸坐标同坐标系下的实时位置了。
后续排查参考
如果以后遇到类似节点属性不更新的问题,可以优先排查这几个方向:
- 操作的节点和你预期的是不是同一个实例,比如本次的局部变量覆盖问题
- 节点是不是已经被正确添加到了当前场景的节点树上
- 获取坐标时使用的坐标系参照是不是和预期一致
内容的提问来源于stack exchange,提问作者Cvh8601
相关产品推荐
相关产品推荐

