HitTest para SKSpriteNode

Este es mi problema:

Trabajo con SpriteKit y quiero ignorar el evento táctil cuando ocurre en algún rectángulo (evite llamar a touchesBegan ). La forma en que me gustaría hacerlo es algo así como "anular el hitTestWithEvent de UIView ". Pero no puedo encontrar ningún método similar para SKSpriteNode que pueda ignorar el evento y evitar llamar a touchesBegan .

Por supuesto

  • Podría establecer isUserInteractionEnabled en falso, pero desactiva todo el sprite no solo una parte.
  • Podría comprobar la location del tacto en el método touchesBegan , pero esto es para tarde: otros sprites debajo en la misma position ya no recibirán este evento.
  • También traté de usar SKCropNode , pero solo evita que se muestre el sprite y los events se manejan incluso en el área invisible.

¿Alguien tiene idea de cómo evitar que parte de Sprite maneje un evento?

Los open func nodes(at p: CGPoint) -> [SKNode] pueden ser útiles para detectar qué nodos ha tocado en un punto. Después de eso, puede excluir la zona CGRect para cada nodo que desee.

 import SpriteKit class GameScene: SKScene { var warningZone = CGRect(x: -80, y: -60, width: 100, height: 100) override func didMove(to view: SKView) { let nodeRed = SKSpriteNode.init(color: .networking, size: CGSize(width:300,height:200)) nodeRed.name = "nodeRed" addChild(nodeRed) nodeRed.position = CGPoint(x:self.frame.midX,y:self.frame.midY) let nodeBlue = SKSpriteNode.init(color: .blue, size: CGSize(width:300,height:200)) nodeBlue.name = "nodeBlue" addChild(nodeBlue) nodeBlue.position = CGPoint(x:self.frame.midX+100,y:self.frame.midY+20) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { let location = touch.location(in: self) let nodesTouched = self.nodes(at: location) for node in nodesTouched { guard let n = node.name else { return } print("Node touched: \(node.name) at point:\(location)") switch n { case "nodeRed": // do your exclusions for the nodeRed print("\(node.frame)") if !warningZone.contains(location) { print("you have touch a safe networking zone") } case "nodeBlue": // do your exclusions for the nodeBlue print("\(node.frame)") default: break } } } } } 

Salida (dibujo la zona de advertencia con un rectángulo blanco solo para mostrarte dónde está …): introduzca la descripción de la imagen aquí