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
}
我正在使用 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
}