gpt4 book ai didi

ios - 使用多点触控解决触摸冲突

转载 作者:行者123 更新时间:2023-11-28 07:50:03 24 4
gpt4 key购买 nike

我有两个 Sprite 会朝着触摸点旋转。在 touchesBegan 中,我使用 if 语句来检查触摸点是否在两个 X 点范围内,以便分离两个 Sprite 的旋转。例如,如果触摸点在左侧范围内,则左侧 Sprite 会向触摸点旋转。我使用 touchesMoved 来更新 Sprite 的旋转。然后,我使用 touchesEnded 将 Sprite 返回到其原始位置。

我面临的问题是,如果我将手指从左向右拖动并因此从左侧范围交叉到右侧范围,则 touchesEnded 不会将第一个 Sprite 返回到其原始状态位置。我知道这是由于触摸在另一个范围内结束,然后只纠正了另一个 Sprite 。我试图通过在 touchesMoved 中添加一个 if 语句来解决这个问题,以便在触摸移动超出一个范围并进入另一个范围时更正位置。

在我使用两根手指(屏幕的每一侧各一根)同时以不同方式旋转两个 Sprite 之前,它一直有效。 Sprite 然后不受控制地从当前旋转位置来回跳到它们的原始位置。解决这个问题的最佳方法是什么?

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 集中的每个“触摸”都是一个不同的触摸事件。当同时使用多个触摸时,每个手指将在集合中用单独的“触摸”表示。请记住,这是一个无序集。

在您提供的代码中,您检索单个触摸事件的位置。您检查触摸位置的 x 值是否高,然后在该条件下,您还检查它是否低。但是您正在检查相同的位置,相同的 x 值。如果 x 值为 768 或以下,它将始终为“!(x > 769)”。如果是 769 或以上,总是“不是 768 或以下”。

因此,对于“移动”功能期间的每个触摸事件,无论它在哪一侧,另一侧都会被重置。如果你在相对的两侧同时有两个触摸事件,它们都会不断地设置自己的一侧并重置另一侧。如您所说,由此产​​生的行为将是“无法控制的”。

解决方案

您需要跟踪 UI 的状态。具体来说,您需要跟踪您的触摸位置。

touchesBegan() 期间,您将位置添加到跟踪触摸集中。在 touchesEnded() 期间,您从跟踪触摸集中删除该位置。在 touchesMoved() 期间,您确定哪个跟踪触摸最接近移动的触摸对象,并相应地更新它。

每次您的设置更新时,您将解析跟踪的触摸集并相应地更新节点的旋转。如果一个节点没有触摸来旋转它,它就会被重置。此函数最好在 for touch in touches 循环之后调用。

关于ios - 使用多点触控解决触摸冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com