Spritekit перемещать камеру, только если не перетаскивать из спрайта
В игре, которую я создаю, пользователь может перемещать камеру, перетаскивая экран, похожий на вид прокрутки. Все это обрабатывается в основном файле сцены с помощью методов touchesBegan и touchesMoved. Однако я также хочу, чтобы пользователь мог перетащить из SKSpriteNode (фактически не перемещая его) в другой SKSpriteNode - тогда я выполняю действие, основанное на 2 узлах. Я могу сделать оба этих штрафа отдельно. Но когда пользователь перетаскивает с одного узла на другой, я не хочу, чтобы камера панорамировала.
Опять же мне удалось решить эту проблему с помощью логического флага, который устанавливается на touchesBegan, если они коснулись узла. Однако экран не панорамируется, если пользователь начинает касаться одного из спрайтов, но завершает один из них, например, он действительно быстро выполнил панорамирование, которое произошло на узле. У кого-нибудь есть хорошие решения для этого?
Одна мысль, которая у меня была, заключалась в том, чтобы сохранить все сенсорные события в touchesMoved, а затем перебрать их в touchesEnded, выполняя ту же логику движения, при условии, что они не начинаются и не заканчиваются на спрайте. например
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
movingTouches.append(touch)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if startedOnSprite && !endedOnSprite || !(startedOnSprite && endedOnSprite) {
let location = movingTouches.last().location(in: self)
let previousLocation = movingTouches.first().location(in: self)
let deltaY = location.y - previousLocation.y
let deltax = location.x - previousLocation.x
gameCamera?.position.y -= deltaY
view.frame.size.height
gameCamera?.position.y = (gameCamera?.position.y)! > viewHeight/2 ? viewHeight/2 : (gameCamera?.position.y)!
gameCamera?.position.y = (gameCamera?.position.y)! < -(viewHeight/2) ? -(viewHeight/2) : (gameCamera?.position.y)!
gameCamera?.position.x -= deltax
gameCamera?.position.x = (gameCamera?.position.x)! < -(viewWidth/2) ? -(viewWidth/2) : (gameCamera?.position.x)!
gameCamera?.position.x = (gameCamera?.position.x)! > (viewWidth/2) ? (viewWidth/2) : (gameCamera?.position.x)!
}
movingTouches = [UITouch]()
endedOnSprite = false
startedOnSprite = false
}
Чтобы усложнить ситуацию, я также хочу, чтобы у спрайтов было событие касания и перетаскивания. Я изо всех сил пытаюсь найти хороший способ сделать все это в SpriteKit
К сожалению, вышеупомянутое не совсем гладко, и, кажется, оно даже не прокручивает расстояние, которое я ожидаю (точно такой же код прокручивается правильно, если меня не беспокоит, запускается ли он на Sprite или нет)
Итак, чтобы быть ясным, я хочу прокручивать поведение, при условии, что пользователь на самом деле не использует палец, чтобы "рисовать" от одного спрайта к другому
1 ответ
Распознаватели жестов на вашей сцене будут делать то, что вам нужно, сохраняя при этом разводы и прикосновения.