Spritekit坐标系意外定位

时间:2017-11-19 19:18:26

标签: swift sprite-kit coordinate

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

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的孩子时的情况。定位很好,但我希望它是玩家的孩子。

enter image description here

第二张图显示了AttackArea是Player的孩子时的定位。右上角的红色方块是AttackArea,红色圆圈是Player。

enter image description here

在这种情况下,为什么AttackArea远离播放器?我怎样才能获得与第一张图片中相同的结果,唯一的例外是AttackArea是玩家的孩子?

1 个答案:

答案 0 :(得分:1)

如果将定位更改为

会发生什么
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