ios - 带Spritekit的Swift-带旋钮的操纵杆教程

标签 ios sprite-kit skspritenode touchesmoved

这些天,我正在用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)
}}

这是本教程的图片:

enter image description here

但是现在我想做些不同的事情。

我希望旋钮只能像十字一样在X和Y轴上移动-像在导轨上一样向上,向下,向左,向右移动。

enter image description here

我确实很了解代码-我认为它更像是一个数学问题:)

有人可以告诉我如何在横档内移动旋钮吗?

最佳答案

为了使角度与十字准线保持一致,您需要将角度四舍五入为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/

相关文章:

ios - 跨多个用户配置权限和共享 Realm

ios - 内存警告和崩溃 ImageIO-jpeg-data

ios - 仅检测矩形物理体一侧的碰撞 - Swift3

ios - Spritekit游戏在iPad模拟器上出现严重滞后

ios - 当 Sprite 到达路径末端时,如何从 SpriteKit 重复 Action 中获得回调?

ios - iOS Facebook SDK 3.1 的设置按钮不起作用

iOS 表格 View 单元格随机为空

ios - Sprite Kit 选择另一个 SKNode 下面的 SKNode

ios - SpriteKit : how to make SKEmitterNode particles twinkle?

ios - SpriteKit 检测按住标签