SpriteKit:计算操纵杆的角度并根据该角度更改精灵

SpriteKit: calculate angle of joystick and change sprite based on that

我正在使用 SpriteKit 制作一款 RPG Birds-eye 风格的游戏。我做了一个操纵杆,因为 D-Pad 不能让玩家对他的角色有足够的控制。

我想不通如何计算根据操纵杆拇指节点的角度更改角色 Sprite 所需的必要数据。

这是我正在使用的代码

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if isTracking == false && base.contains(location) {
            isTracking = true
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location: CGPoint = touch.location(in: self)
        if isTracking == true {

            let v = CGVector(dx: location.x - base.position.x, dy: location.y - DPad.position.y)
            let angle = atan2(v.dy, v.dx)
            let deg = angle * CGFloat(180 / Double.pi)

            let Length:CGFloat = base.frame.size.height / 2
            let xDist: CGFloat = sin(angle - 1.57079633) * Length
            let yDist: CGFloat = cos(angle - 1.57079633) * Length

            print(xDist,yDist)

            xJoystickDelta = location.x * base.position.x / CGFloat(Double.pi)
            yJoystickDelta = location.y * base.position.y / CGFloat(Double.pi)


            if base.contains(location) {
                thumbNode.position = location
            } else {
                thumbNode.position = CGPoint(x: base.position.x - xDist, y: base.position.y + yDist)
            }

        }

    }

}

更新方法

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    if xJoystickDelta > 0 && yJoystickDelta < 0 {
        print("forward")
    }

}

我现在设置的方式基于拇指节点在下面四个标记部分中的位置,以交叉方法测试操纵杆位置的正或负状态

我不希望它那样做

我如何设置它,以便它根据拇指节点在我的操纵杆底座内实际指向的位置更改 sprite,就像这样。

我已经为此苦苦挣扎了 3 天,所以我们将不胜感激。

这看起来太复杂了。只需比较 x 和 y 分量 差向量 v。像这样:

if v.dx > abs(v.dy) {
    // right
} else if v.dx < -abs(v.dy) {
    // left
} else if v.dy < 0 {
    // up
} else if v.dy > 0 {
    // down
}