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

时间:2017-11-07 13:40:56

标签: ios swift sprite-kit joystick

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

我无法根据操纵杆拇指节点的角度计算更改角色精灵所需的必要数据。

这是我正在使用的代码

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")
    }

}

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

image 1

我不希望它这样做

如何设置它以便根据拇指节点实际指向我操纵杆底座的位置来改变精灵。

image 2

我一直在努力奋斗3天,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

看起来太复杂了。只需比较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
}