You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:24:03