SKSpriteNode UserInteractionEnabled 不工作

Posted

技术标签:

【中文标题】SKSpriteNode UserInteractionEnabled 不工作【英文标题】:SKSpriteNode UserInteractionEnabled Not Working 【发布时间】:2015-11-22 01:13:14 【问题描述】:

我到处看了,但没有任何效果。以为我会自己问这个问题。我正在使用 SpriteKit 在 ios 9 中创建一个小游戏。我的游戏将有左右控制器按钮来移动玩家精灵。我为方向键添加了 SKSpriteNodes,如下所示

在主场景的顶部我放了:

private var leftDirectionalPad = SKSpriteNode(imageNamed: "left")
private var rightDirectionalPad = SKSpriteNode(imageNamed: "right")

然后我运行一个名为 prepareDirectionalPads 的方法

    func prepareDirectionalPads() 

    // left

    self.leftDirectionalPad.position.x = self.size.width * directionalPadLeftXPositionMultiplier
    self.leftDirectionalPad.position.y = self.size.height*directionalPadYPosition
    self.leftDirectionalPad.size.width = self.leftDirectionalPad.size.width/directionalPadSizeReductionMultiple
    self.leftDirectionalPad.size.height = self.leftDirectionalPad.size.height/directionalPadSizeReductionMultiple

    self.leftDirectionalPad.name = "leftDirectionalPad"
    self.leftDirectionalPad.alpha = directionalPadAlphaValue
    self.leftDirectionalPad.zPosition = 1
    self.addChild(leftDirectionalPad)
    self.leftDirectionalPad.userInteractionEnabled = true

    // right

    self.rightDirectionalPad.position.x = self.leftDirectionalPad.position.x*directionalPadSpacingMultiple
    self.rightDirectionalPad.position.y = self.size.height*directionalPadYPosition
    self.rightDirectionalPad.size.width = self.rightDirectionalPad.size.width/directionalPadSizeReductionMultiple
    self.rightDirectionalPad.size.height = self.rightDirectionalPad.size.height/directionalPadSizeReductionMultiple

    self.rightDirectionalPad.name = "rightDirectionalPad"
    self.rightDirectionalPad.alpha = directionalPadAlphaValue
    self.rightDirectionalPad.zPosition = 1
    self.addChild(rightDirectionalPad)
    self.rightDirectionalPad.userInteractionEnabled = true


我清楚地将每个 SKSpriteNode 的 userInteractionEnabled 设置为 true。然后,我开始接触了……

override func touchesBegan(let touches: Set<UITouch>, withEvent event: UIEvent?) 
       /* Called when a touch begins */
        var touch = touches.first! as UITouch
        var location = touch.locationInView(self.view)
        var node = nodeAtPoint(location)

        print("Touched")
 

注意:我也尝试过 var location = touch.locationInNode(self) 但这也不起作用。

然后我运行应用程序(在我的 xCode Simulator 或 iPhone 6 上)。如果我触摸 SKNodes,什么也不会发生。没有任何内容打印到控制台。但是,如果我触摸屏幕上的其他任何位置,我就会被“触摸”到屏幕上。

我做错了什么?我想检测垫子上的触摸,以便相应地移动播放器精灵。这可能是我忘记做的非常愚蠢的事情。感谢您的时间和耐心。非常感激。

【问题讨论】:

【参考方案1】:

想通了。所以显然self.leftDirectionalPad.userInteractionEnabled = true 不起作用。它必须是self.leftDirectionalPad.userInteractionEnabled = false,这是非常违反直觉的。我不明白,但它现在有效。 touchesBegan 在用户触摸 SKSpriteNode 时做出响应。

    let touch = touches.first! as UITouch
    let location = touch.locationInNode(self)
    let node = nodeAtPoint(location)

    if(node.name == leftDirectionalPad.name)
    
        print("left")
    
    else if (node.name == rightDirectionalPad.name)
    
         print("right")
    

【讨论】:

对于将来遇到这种情况的人,user3286381 希望他的场景捕捉触摸事件,而不是他的按钮。这就是需要将userInteractionEnabled 设置为false 的原因。如果他的 touch begin 和 touch end 代码在 directionPad 使用的类中,它会起作用。 啊,我明白了。谢谢你的解释! 所以如果它的 userInteractionEnabled 设置为 true,每个节点都负责处理自己的触摸......?真的很有趣,我在一个没有子类化的节点上遇到了这个问题,所以将 userInteractionEnabled 设置为 false 是可行的,因为我正在处理父视图中的触摸。

以上是关于SKSpriteNode UserInteractionEnabled 不工作的主要内容,如果未能解决你的问题,请参考以下文章

知道 skspritenode 已经完全移过另一个 skspritenode

创建新的 SKSpriteNode 与使用 SKSpriteNode 的副本

SKSpriteNode 不应受另一个 SKSpriteNode 影响

SKSpriteNode - 创建一个圆角节点?

如何将 SKSpriteNode 合并到 SKTexture 以在 Swift 3 中形成新的 SKSpriteNode?

SKSpriteNode 多个纹理