我有两个雪碧旋转到接触点。在touchesBegan
中,我使用if语句检查触摸点是否在两个X点范围内,以便分离两个sprite的旋转。例如,如果触摸点在左范围内,则左精灵会朝着触摸点旋转。我使用touchesMoved
来更新精灵的旋转。然后我使用touchesEnded
将精灵返回到其原始位置。
我面临的问题是,如果我将手指从左向右拖动,从而从左范围交叉到右范围,那么touchesEnded
不会将第一个精灵返回到其原始位置。我知道这是由于触摸结束在另一个范围,然后只纠正了另一个精灵。我试图通过在touchesMoved中添加一个if语句来解决这个问题,以便在触摸移动到一个范围以外的另一个范围时更正位置。
直到我用两个手指,屏幕两边各一个手指,同时旋转两个精灵。然后精灵会不受控制地从当前旋转位置来回跳跃到原始位置。解决这个问题的最佳方法是什么?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch: AnyObject in touches {
location = touch.location(in: self)
let DegreesToRadians = Pi / 180
let rightDeltaX = location.x - rightSprite.position.x
let rightDeltaY = location.y - rightSprite.position.y
let rightAngle = atan2(rightDeltaY, rightDeltaX)
let leftDeltaX = location.x - leftSprite.position.x
let leftDeltaY = location.y - leftSprite.position.y
let leftAngle = atan2(leftDeltaY, leftDeltaX)
if 0...768 ~= location.x {
leftSprite.zRotation = leftAngle - 90 * DegreesToRadians
}
if 769...1536 ~= location.x {
rightSprite.zRotation = rightAngle - 90 * DegreesToRadians
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch: AnyObject in touches {
location = touch.location(in: self)
let DegreesToRadians = Pi / 180
let rightDeltaX = location.x - rightSprite.position.x
let rightDeltaY = location.y - rightSprite.position.y
let rightAngle = atan2(rightDeltaY, rightDeltaX)
let leftDeltaX = location.x - leftSprite.position.x
let leftDeltaY = location.y - leftSprite.position.y
let leftAngle = atan2(leftDeltaY, leftDeltaX)
if 0...768 ~= location.x {
leftSprite.zRotation = leftAngle - 90 * DegreesToRadians
if !(769...1536 ~= location.x) {
rightSprite.zRotation = 0
}
}
if 769...1536 ~= location.x {
rightSprite.zRotation = rightAngle - 90 * DegreesToRadians
if !(0...768 ~= location.x) {
leftSprite.zRotation = 0
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch: AnyObject in touches {
location = touch.location(in: self)
if 0...768 ~= location.x {
leftSprite.zRotation = 0
}
if 769...1536 ~= location.x {
rightSprite.zRotation = 0
}
}
}
最佳答案
UITouch集合中传递给函数的每个“touch”都是一个不同的touch事件。当同时使用多个触摸时,每个手指将在集合中用单独的“触摸”表示。请记住,这是一个无序的集合。
在您提供的代码中,您将检索单个触摸事件的位置。检查触摸位置的x值是否高,然后在该条件下,还检查它是否低。但是你要检查相同的位置,相同的x值。如果x值为768或更低,它将始终为“!(x>769)”。如果是769或以上,则始终为“不是768或以下”。
因此,对于“移动”功能期间的每个触摸事件,无论它在哪一侧,另一侧都会重置。如果你有两个触摸事件同时在对方,他们都不断设置自己的一方和重置另一方。由此产生的行为将如你所说的“无法控制”。
解决方案
您需要跟踪UI的状态。具体来说,你需要跟踪你的触摸位置。
在touchesBegan()
过程中,将位置添加到跟踪的接触集。在touchesEnded()
过程中,从跟踪的接触集中移除位置。在touchesMoved()
过程中,确定哪个跟踪的触摸最接近移动的触摸对象,并相应地更新它。
每次更新集合时,都会分析跟踪的触摸集合,并相应地更新节点的旋转。如果一个节点没有旋转它的触控,那么它将被重置。这个函数最好在for touch in touches
循环之后调用。