这些天,我正在用Swift编写SpriteKit教程。
我用旋钮对操纵杆进行了编程,可以将其在操纵杆圈内的任何位置移动。
以下是相关的代码段:
for touch in touches {
let position = touch.location(in: joystick)
let length = sqrt(pow(position.y, 2) + pow(position.x, 2))
let angle = atan2(position.y, position.x)
if knobRadius > length {
joystickKnob.position = position
} else {
joystickKnob.position = CGPoint(x: cos(angle) * knobRadius, y: sin(angle) * knobRadius)
}}
这是本教程的图片:
但是现在我想做些不同的事情。
我希望旋钮只能像十字一样在X和Y轴上移动-像在导轨上一样向上,向下,向左,向右移动。
我确实很了解代码-我认为它更像是一个数学问题:)
有人可以告诉我如何在横档内移动旋钮吗?
最佳答案
为了使角度与十字准线保持一致,您需要将角度四舍五入为pi / 2
为此,请执行以下操作:
angle = (angle * 2 / CGFloat.pi).rounded() * (CGFloat.pi / 2)
下面,我修改了您的代码,使其工作得更好,并允许您避免分支。
我使用的是基准半径而不是旋钮半径,因此您永远都不能超过基准半径。
for touch in touches {
let position = touch.location(in: joystick)
let radius = min(baseRadius,sqrt(pow(position.y, 2) + pow(position.x, 2))
// a nicer way to get radius
//let radius = min(baseRadius,position.distance(to:CGPoint.zero))
let angle = atan2(position.y, position.x)
if crossHairStick
{
angle = (angle * 2 / CGFloat.pi).rounded() * (CGFloat.pi / 2)
}
joystickKnob.position = CGPoint(x: cos(angle) * radius, y: sin(angle) * radius)
}
如果要将旋钮保持在底座内,请减去旋钮半径。 (假定两个半径均为正,否则使用半径的绝对值)
for touch in touches {
let position = touch.location(in: joystick)
let radius = min(baseRadius - knobRadius,sqrt(pow(position.y, 2) + pow(position.x, 2))
let angle = atan2(position.y, position.x)
if crossHairStick
{
angle = (angle * 2 / CGFloat.pi).rounded() * (CGFloat.pi / 2)
}
joystickKnob.position = CGPoint(x: cos(angle) * radius, y: sin(angle) * radius)
}
关于ios - 带Spritekit的Swift-带旋钮的操纵杆教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50178251/