Разрешить распространение касаний в SpriteKit - PullRequest
1 голос
/ 03 апреля 2020

С учетом SpriteKit сцены s и одного узла a типа T, который наследуется от SKSpriteNode, содержащегося в s, если оба параметра s и a перекрывают любой обработчик касания, событие касания вызывается исключительно для того, что кажется самым верхним (самым высоким zPosition) узлом.

Если бы я хотел, чтобы сцена и ее узел одновременно выполняли два разных действия, какой паттерн лучше всего использовать?

В этом случае было бы лучше :

  • Пусть сцена обрабатывает все касания, извлекая узлы в месте, где произошло касание?
  • Есть протокол Touchable, что сцена будет реализовать и заставить какой-либо узел отправлять идентификатор на сцену с помощью гипотетического touched(_ nodeID: Int) метода?
  • Все ли дочерние узлы ссылаются на объект stati c TouchHandler, который будет выполнять оба действия?

Что бы вы предложили что-нибудь еще?

Обновление :

Учитывая следующий код:

class Parent: SKScene {
    override func didMove(to view: SKView) {
        self.addChild(Foo())
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //  React to touch, and, for example, move the scene around
    }
}

class Foo: SKSpriteNode {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //  React to touch, and, for example, scale up the node by 60%
    }
}

Если пользователь нажимает на узел Foo, показывая на экране, вызывается только его метод touchesBegan(_, event:) - метод Parent игнорируется.

Какой шаблон лучше всего использовать, чтобы оба объекта могли одновременно реагировать на обратный вызов touchesBegan(_, event:) ?

1 Ответ

1 голос
/ 03 апреля 2020

Мне нравится обрабатывать как можно больше кода в классе объектов. Так что я бы обработал любой код касания объекта внутри его файла класса и отправил касание обратно в сцену для отдельной обработки сценой.

class Cat: SKSpriteNode {

    var isEnabled = true
    var sendTouchesToScene = true

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent!) {

         guard isEnabled else { return }

         //send touch to scene
         if sendTouchesToScene {
             super.touchesBegan(touches, with event)
         }

         //handle touches for cat
    }
}
...