Spritekit 坐标系意外定位

Spritekit Coordinate System unexpected positioning

我有 classes AttackArea、Player 和 GameScene。 我想实例化一个新的 AttackArea object 并将其放置在玩家附近,具体取决于面对的玩家。现在我在正确定位方面遇到了问题。如果我将 AttackArea 添加为 GameScene 的 child,则定位会按预期工作。但如果我这样做,AttackArea 就不会随着玩家移动。否则,如果我将 AttackArea 添加为玩家的 child,它会随着玩家移动。这正是我想要的。这里的问题是 AttackArea 的定位现在离 Player 很远。这是播放器中的代码 class:

func attack(){
    let attack = AttackArea(color: .red, size: CGSize(width: self.frame.width, height: self.frame.height / 2))
    var animation = ""
    switch playerFacing{
    case .back:
        attack.position = CGPoint(x: self.position.x, y: self.position.y + 40)
        animation = Constants.Actions.playerAttackBack
    case .front:
        attack.position = CGPoint(x: self.position.x, y: self.position.y - 40)
        animation = Constants.Actions.playerAttackFront
    case .left:
        attack.position = CGPoint(x: self.position.x - 40, y: self.position.y)
        animation = Constants.Actions.playerAttackLeft
    case .right:
        attack.position = CGPoint(x: self.position.x + 40, y: self.position.y)
        animation = Constants.Actions.playerAttackRight
    case .none:
        break
    }
    attack.zPosition = self.zPosition + 1
    attack.setup()
    if animation != ""{
        self.run(SKAction(named: animation)!)
    }
    self.addChild(attack)
}

第一张图是AttackArea是GameScene的child时的情况。定位很好,但我希望它是 child 的播放器。

第二张图为AttackArea为childPlayer时的定位。右上角的红色方块是AttackArea,红色圆圈是Player。

为什么在这种情况下 AttackArea 离 Player 这么远?我如何才能获得与第一张图片相同的结果,唯一的例外是 AttackArea 是玩家的 child?

如果将定位更改为

会发生什么
switch playerFacing{
    case .back:
        attack.position = CGPoint(x: 0, y: 0 + 40)
        animation = Constants.Actions.playerAttackBack
    case .front:
        attack.position = CGPoint(x: 0, y: 0 - 40)
        animation = Constants.Actions.playerAttackFront
    case .left:
        attack.position = CGPoint(x: 0 - 40, y: 0)
        animation = Constants.Actions.playerAttackLeft
    case .right:
        attack.position = CGPoint(x: 0 + 40, y: 0)
        animation = Constants.Actions.playerAttackRight
    case .none:
        break
    }

我怀疑您的玩家(例如)可能位于位置 500、500,并且您正在将这些值重新添加到攻击位置,所以现在它的位置是 1000、1040