Swift 如何用触摸旋转Spritode?

Swift 如何用触摸旋转Spritode?,swift,xcode,sprite-kit,skspritenode,swift-playground,Swift,Xcode,Sprite Kit,Skspritenode,Swift Playground,如何通过触摸在固定点上旋转SpriteKit节点。因此,当用户拖动手指时,它会转动。我也希望能够得到转速。(之前有人问过这个问题,但我想知道如何使用SpriteKit进行此操作) 斯威夫特3游乐场 到目前为止,我已经知道了这一点,但有时我会得到var deltaAngle=angle-startingAngle的错误!错误-“在展开可选值时意外发现零” class游戏场景:SKScene{ var启动角度:CGFloat? var启动时间:时间间隔? 覆盖func didMove(到视图:SKV

如何通过触摸在固定点上旋转SpriteKit节点。因此,当用户拖动手指时,它会转动。我也希望能够得到转速。(之前有人问过这个问题,但我想知道如何使用SpriteKit进行此操作) 斯威夫特3游乐场

到目前为止,我已经知道了这一点,但有时我会得到var deltaAngle=angle-startingAngle的错误!错误-“在展开可选值时意外发现零”

class游戏场景:SKScene{
var启动角度:CGFloat?
var启动时间:时间间隔?
覆盖func didMove(到视图:SKView){
let wheel=SKSpriteNode(图像名为:“IMG_6797.PNG”)
车轮位置=CG点(x:200,y:200)
wheel.name=“车轮”
车轮调整刻度(0.5)
wheel.physicsBody=SKPhysicsBody(圆环半径:wheel.size.width/2)
//根据需要更改此属性(将其增大以加快速度)
车轮。物理车身!。角度阻尼=4
wheel.physicsBody?.pinted=真
轮子。物理体?。受重力影响=假
addChild(车轮)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
让节点=点(位置)
如果node.name==“控制盘”{
设dx=location.x-node.position.x
设dy=location.y-node.position.y
//存储角度和当前时间
起动角度=atan2(dy,dx)
startingTime=touch.timestamp
node.physicsBody?.angularVelocity=0
}
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
让节点=点(位置)
如果node.name==“控制盘”{
设dx=location.x-node.position.x
设dy=location.y-node.position.y
让角度=atan2(dy,dx)
//计算角速度;在pi/-pi处处理包裹
var deltaAngle=角度-启动角度!
如果abs(deltaAngle)>CGFloat.pi{
如果(三角洲角度>0){
deltaAngle=deltaAngle-CGFloat.pi*2
}
否则{
deltaAngle=deltaAngle+CGFloat.pi*2
}
}
设dt=CGFloat(touch.timestamp-startingTime!)
let速度=三角洲角/dt
节点.physicsBody?.angularVelocity=速度
起始角度=角度
startingTime=touch.timestamp
}
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
起动角=零
启动时间=零
}

}

这个错误的意思正是它所说的。最有可能的情况是,“轮子”在touchsbeging中未被触摸,但随后在touchsmoved中注册,导致startingAngle未设置为任何值且为零

因为如果用户没有开始触摸轮子,你可能不希望你的轮子旋转,所以我会在touchedMoved中添加一个防护装置

...
let angle = atan2(dy, dx)

guard startingAngle != nil else {return} //Exit the function if starting angle was never set

var deltaAngle = angle - startingAngle!
...

到目前为止你试过什么?;)我最初打算使用UIKit(UIGestureRecognitor),但我在wwdc游乐场中使用的SpriteKit太少,需要添加更多。我是SpriteKit新手,因此不确定如何在Whirlwind执行此操作。您应该使用touchesBegind和touchesMoved覆盖获取触摸位置,然后计算节点旋转到的切线角度。对于初学者,请确保节点图形资源朝向右侧,否则将禁用角度。从那里开始,如果你还需要帮助,就带一些代码回来。我已经设法让它工作了,但我遇到了一个错误-一些东西(编辑的问题)@thevalyreangroups代码旋转轮子如果用户轻击它,你如何让它在用户拖动手指时转动?
...
let angle = atan2(dy, dx)

guard startingAngle != nil else {return} //Exit the function if starting angle was never set

var deltaAngle = angle - startingAngle!
...