Spritekit двигает камеру, только если не перетаскивает со спрайта

В игре, которую я создаю, пользователь может перемещать камеру, перетаскивая ее по экрану, подобно прокрутке. Все это обрабатывается в основном файле сцены с помощью методов 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)

Итак, чтобы быть ясным, я хочу поведение прокрутки, при условии, что пользователь на самом деле не использует палец, чтобы «рисовать» от одного спрайта к другому.


person TommyBs    schedule 10.01.2017    source источник


Ответы (1)


Распознаватель жестов в вашей сцене делайте то, что вам нужно, разделяя касания и свайпы.

person Mark Brownsword    schedule 10.01.2017
comment
Будут ли они? Теоретически перетаскивание от одного спрайта к другому будет классифицироваться как смахивание, не приведет ли это к панорамированию? - person TommyBs; 11.01.2017
comment
У вас есть много возможностей точного управления распознавателями жестов с состоянием, указывающим, завершен ли жест. - person Mark Brownsword; 11.01.2017
comment
Кроме того, каждый жест отличается и предназначен для того, чтобы не мешать друг другу, и различные виды панорамирования можно обрабатывать, зная, что является целевым местоположением, то есть спрайтом или фоновым узлом? - person Mark Brownsword; 11.01.2017
comment
Я ценю, что есть контроль над распознавателями жестов, но я все еще не уверен, позволят ли они мне сделать то управление, которое я хочу, чтобы иметь возможность перетаскивать узел, но если он не заканчивается на другом узле, вместо этого выполните прокрутку. Сказав, что я рассмотрю этот пост здесь stackoverflow.com/questions/5111828/, когда у меня будет немного больше времени, и посмотреть, смогу ли я выполнить то, что хочу. Спасибо за ваш вклад - person TommyBs; 11.01.2017