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
我有 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