【问题标题】:SKSpriteNode subclassing. iOS 8.4 vs 9.xSKSpriteNode 子类化。 iOS 8.4 与 9.x
【发布时间】:2016-01-24 17:07:36
【问题描述】:

我已经制作了一个应用程序,并且一直在使用具有此类特殊属性的自定义子类

class SKSpriteNodeB: SKSpriteNode{

var tempFlag = Bool()
var tempA = CGFloat()
var tempB = CGFloat()
var tempC = CGFloat()    

}

并像这样调用:

   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for _ in touches {
        let touch: UITouch = touches.first!
        let location = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(location) as? SKSpriteNodeB
        touchedNode.tempA = 5.0
        touchedNode.tempFlag = false
        //Do something
}}

这在 iOS 9.0 及更高版本中运行良好,但是当我在运行 iOS 8.4 的 iPad mini 上测试它时,这些 SKSpriteNodeB 对触摸没有响应。我有其他不是 SKSpriteNodeB 的节点并且运行正常。一些建议将不胜感激!谢谢!

【问题讨论】:

  • 您是否将精灵的userInteractionEnabled 属性设置为true?此外,除非您向精灵添加了子节点,否则无需检查nodeAtPoint,因为只有在触摸精灵时才会调用touchesBegan
  • 我没有将它设置为true,但没有将userInteractionEnabled显式设置为false,因为我认为它默认为false。另外我认为我需要nodeAtPoint,因为我有不同的节点类型,即SKLabelNode,并且我有一个if 语句来检查touchedNode.name
  • 我想我可能已经解决了。我必须对此进行更多研究,但我认为这与节点的 zPosition 有关。我做了一个简单的print(touchedNode.name) 并发现由于某种原因在iOS 8.4 中当我将节点的hidden 属性设置为true 时,我仍然可以点击它。我必须增加节点的zPosition 才能点击它。你知道这是为什么吗?
  • 设置节点的hidden 属性可以防止它被渲染。该节点仍然与场景中的其他节点交互并响应触摸。我相信您需要设置userInteractionEnable = true 以允许您的精灵子类接收触摸事件。
  • 设置userInteractionEnabled = true 解决了这个问题并使其现在可以点击。然而,现在我有时可以点击节点并点击位于其下方的另一个SKLabelNode,即使它设置为hiddenuserInteractionEnabled = true。我可能会放弃,让我的应用只兼容 9.0 及更高版本。

标签: ios sprite-kit subclass skspritenode


【解决方案1】:

在这种情况下我会做的一件事是,当我希望节点“隐藏”但仍可点击时,我没有将隐藏设置为 true,而是将 alpha 设置为 0.0,而当我想要“取消隐藏”节点时我只是增加节点的alpha。

【讨论】:

  • 我必须在某处记下来。巧妙的把戏!但是我不希望其他节点可以点击。即使它们被设置为隐藏,它们也只是可点击的
  • 在这种情况下,您不想被点击的节点只需将它们设置为 userInteractionEnabled = false。
  • 将节点的userInteractionEnabled 设置为false 不会使其不可点击。它只会阻止它接收触摸事件(不会调用它的touchBegan)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多