В игре, которую я создаю, пользователь может перемещать камеру, перетаскивая ее по экрану, подобно прокрутке. Все это обрабатывается в основном файле сцены с помощью методов touchesBegan и touchesMoved. Однако я также хочу, чтобы пользователь мог перетаскивать из SKSpriteNode (фактически не перемещая его) в другой SKSpriteNode — затем я выполняю действие на основе двух узлов. Я могу сделать и то, и другое по отдельности. Но когда пользователь перетаскивает с одного узла на другой, я не хочу, чтобы камера панорамировала.
Опять же, мне удалось решить эту проблему с помощью логического флага, установленного на 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)
Итак, чтобы быть ясным, я хочу поведение прокрутки, при условии, что пользователь на самом деле не использует палец, чтобы «рисовать» от одного спрайта к другому.