我正在尝试创建一个可旋转的节点,类似于这个问题中的“奖品轮”。到目前为止,我已经实现了甩动功能,通过使用UIPanGestureRecognizer在物理体上添加角动量来实现,效果非常好。我还可以使用触摸停止旋转。
现在,我正在尝试使用拖动或滑动手势来允许对轮子进行微调,以便如果玩家对最终结果不满意,他们可以手动旋转/拖动/旋转它以达到他们喜欢的旋转位置。
目前,我在touchesBegan中保存触摸位置,并尝试在update循环中递增我的节点的zRotation。
旋转不会跟随我的手指移动,并且很卡顿。我不确定是否准确地读取了手指移动的信息,或者手指的位置变化没有被准确地转换成弧度。我怀疑在检测到触摸后在update中处理它并不是一个好的解决方案。
这是我的代码。
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) {
if let touch = touches.first as? UITouch {
var location = touch.locationInView(self.view)
location = self.convertPointFromView(location)
mostRecentTouchLocation = location
let node = nodeAtPoint(location)
if node.name == Optional("left") && node.physicsBody?.angularVelocity != 0
{
node.physicsBody = SKPhysicsBody(circleOfRadius:150)
node.physicsBody?.applyAngularImpulse(0)
node.physicsBody?.pinned = true
}
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if mostRecentTouchLocation != CGPointZero{
let node = nodeAtPoint(mostRecentTouchLocation)
if node.name == Optional("left")
{
var positionInScene:CGPoint = mostRecentTouchLocation
let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
let maths:CGFloat = angle - (CGFloat(90) * (CGFloat(M_PI) / 180.0))
node.zRotation += maths
mostRecentTouchLocation = CGPointZero
}
}
}
为了便于调试,我已将一些数学公式拆分成多行。
如果需要,我可以添加PanGestureRecognizer代码,但现在我会尽量保持简短。
编辑 根据GilderMan的建议,这是我的最新代码。我认为它运行得更好了,但旋转远未平滑。它会跳动大的增量,并且不能很好地跟随手指。这是否意味着我的角度计算有问题?
override func didSimulatePhysics() {
if mostRecentTouchLocation != CGPointZero {
let node = nodeAtPoint(mostRecentTouchLocation)
if node.name == Optional("left")
{
var positionInScene:CGPoint = mostRecentTouchLocation
let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
node.zRotation += angle
println(angle)
mostRecentTouchLocation = CGPointZero
}
}
}
zRotation
和atan2f
的单位是弧度。 - 0x141E