2016-11-04 3 views
1

Я пытаюсь создать наложение в SpriteKit, используя SKSpriteNode. Тем не менее, я хочу, чтобы штрихи проходили через оверлей, поэтому я установил isUserInteractionEnabled в false. Однако, когда я это делаю, SKSpriteNode все еще, кажется, поглощает все касания и не позволяет базовым узлам ничего делать.SKSpriteNode не позволяет касаниям проходить, когда isUserInteractionEnabled false

Вот пример того, что я говорю о:

class 

TouchableSprite: SKShapeNode { 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     print("Touch began") 
    } 
} 

class GameScene: SKScene { 
    override func sceneDidLoad() { 
     // Creat touchable 
     let touchable = TouchableSprite(circleOfRadius: 100) 
     touchable.zPosition = -1 
     touchable.fillColor = SKColor.red 
     touchable.isUserInteractionEnabled = true 
     addChild(touchable) 


     // Create overlay 
     let overlayNode = SKSpriteNode(imageNamed: "Fade") 
     overlayNode.zPosition = 1 
     overlayNode.isUserInteractionEnabled = false 
     addChild(overlayNode) 
    } 
} 

Я попытался подклассов SKSpriteNode и вручную делегировании события прикосновения к соответствующим узлам, но это приводит к много странного поведения.

Любая помощь будет высоко оценена. Благодаря!

+0

Ваш zposition находится ниже сцены, так что ваш ZOrder является overlay-> scene-> touchable – Knight0fDragon

ответ

3

Вы должны быть осторожны с zPosition. Можно пойти за сценой, что усложняет ситуацию.

Хуже порядок прикосновения. Я помню, что читал, что он основан на дереве узлов, а не на zPosition. Отключите прикосновение сцены, и вы увидите результаты.

Это то, что он теперь говорит:

Хит-тестирование Заказать Является Реверс Заказать Drawing В сцене, когда SpriteKit обрабатывает прикосновения или событие мыши, она ходит на сцену, чтобы найти Ближайшие узел, который хочет принять событие. Если этот узел не хочет события, SpriteKit проверяет следующий ближайший узел и так далее. Заказ , в котором обрабатывается хитовое тестирование, по существу, является обратным от чертежным заказом.

Для определения узла, который необходимо учитывать при тестировании при ударе, его свойство userInteractionEnabled должно быть установлено в YES. Значение по умолчанию НЕТ для любого узла, кроме узла сцены. Узел, который хочет получать события , должен реализовать соответствующие методы ответа из своего родительского класса (UIResponder на iOS и NSResponder на OS X). Это один из нескольких мест, где вы должны реализовать код для конкретной платформы в SpriteKit.

Но это, возможно, не всегда так, поэтому вам нужно будет проверить между 8, 9 и 10 для последовательности

+0

Это своего рода мудрость, легкая комедия и заостренный комментарий к человеку в лучшем виде. Спасибо. – Confused

3

Чтение фактических источников вы найдете:

/** 
    Controls whether or not the node receives touch events 
*/ 
open var isUserInteractionEnabled: Bool 

, но это относится к внутренним методам узла прикосновений. По умолчанию isUserInteractionEnabled is false, то прикосновение к ребенку, подобному вашему наложению SKSpriteNode, по умолчанию является простым касанием к основному (или родительскому) классу (объект здесь, существует, но если вы не реализуете никаких действие, вы просто прикасаетесь к нему)

Чтобы пройти через наложение с помощью мыши, вы можете реализовать код, подобный приведенному ниже, на ваш GameScene. Помните также, что не используйте -1 как zPosition, потому что это означает, что он находится ниже вашей сцены.

P.S.: Я добавил name своим спрайтов вспомнить его touchesBegan но вы можете создать глобальные переменные для вашего GameScene:

override func sceneDidLoad() { 
     // Creat touchable 
     let touchable = TouchableSprite(circleOfRadius: 100) 
     touchable.zPosition = 0 
     touchable.fillColor = SKColor.red 
     touchable.isUserInteractionEnabled = true 
     touchable.name = "touchable" 
     addChild(touchable) 
     // Create overlay 
     let overlayNode = SKSpriteNode(imageNamed: "fade") 
     overlayNode.zPosition = 1 
     overlayNode.name = "overlayNode" 
     overlayNode.isUserInteractionEnabled = false 
     addChild(overlayNode) 
    } 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     print("GameScene Touch began") 
     for t in touches { 
      let touchLocation = t.location(in: self) 
      if let overlay = self.childNode(withName: "//overlayNode") as? SKSpriteNode { 
       if overlay.contains(touchLocation) { 
        print("overlay touched") 
        if let touchable = self.childNode(withName: "//touchable") as? TouchableSprite { 
         if touchable.contains(touchLocation) { 
          touchable.touchesBegan(touches, with: event) 
         } 
        } 
       } 
      } 
     } 
    } 
}