【问题标题】:Sprite node does not detect touches?Sprite 节点未检测到触摸?
【发布时间】:2015-06-26 17:54:13
【问题描述】:

我需要检测用户是否点击了精灵节点。

我在这里创建精灵节点:

var enemy1Texture = SKTexture(imageNamed: "enemy1")
enemy1 = SKSpriteNode(texture: enemy1Texture)
enemy1.setScale(0.3)
enemy1.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 1.2)
        self.addChild(enemy1)

touchesBegan这里我设置了检测触摸的变量:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)  {
        /* Called when a touch begins */

        for touch: AnyObject in touches {

            let touch = touches.first as? UITouch
            let location = touch!.locationInNode(self)
            let touchedNode = self.nodeAtPoint(location)
            let touchedNodeName = touchedNode.name

            enemy1.name = "enemy1"
            enemy1.userInteractionEnabled = true

然后在函数的最后我检查被触摸的精灵节点的名称并尝试执行相应的代码:

if touchedNodeName == "enemy1"  {
    //Enemy touched code
    println("Enemy1 was touched!")          
}

而且它不起作用。当我在精灵节点向下移动时点击它时,控制台不会打印任何内容。我做错了什么?

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    在您创建touchedNodeName 变量时,enemy1 节点的名称没有设置Name 属性。移动

    enemy1.name = "enemy1"
    

    在节点创建之后

    enemy1 = SKSpriteNode(texture: enemy1Texture)
    

    所以变成了

    enemy1 = SKSpriteNode(texture: enemy1Texture)
    enemy1.name = "enemy1"
    

    然后当你得到touchedNode.name时你可以检查它是否是“enemy1”

    注意:如果您尝试在每次触摸时访问 .Name 属性,请小心,您应该为场景中的每个节点分配一个名称,否则它将为零。或者你可以检查

    if(touchedNode.Name != nil){
         //Then get the .Name variable and perform your checks
    }
    

    在另一种方法中,您可以检查您按下的节点是否是enemy1节点,但该节点应该在 touchesBegan 函数中可见,如下所示

    if(touchedNode == enemy1){
        //Your code here
    }
    

    【讨论】:

    • 你是对的——在 didMoveToView 中命名节点是问题的一半,另一半是我正在检查是否在 if-else 语句的结尾处点击了该节点已经满足,所以它没有运行触摸节点的代码。谢谢!
    【解决方案2】:

    我认为您在这里错误地使用了 userInteractionEnabled。为了以您尝试检测的方式(在场景的 touchesBegan 中)检测触摸,这是完全没有必要的。我假设 touchesBegan 是 GameScene 中的方法,因为enemy1 是 SKSpriteNode 而不是 SKSpriteNode 的子类,并实现了 touchesBegan 方法。

    在节点上使用 userInteractionEnabled 允许节点本身接收触摸。如果你决定这样做,你需要在那个特定的对象上实现 touchesBegan:(正如我上面所说的,你必须继承 SKSpriteNode 的子类)。但我想这不是这里的情况,也不是你想要的。请注意,nodeAtPoint 是基于触摸位置的(场景默认接收触摸),它会告诉你在某个位置是否有任何节点,它不关心该节点是否接收到触摸。

    因此,根据您发布的代码,我想说您必须正确设置 节点名称 才能在 touchesBegan 方法中检查它。只需在创建敌人后立即在 didMoveToView 方法中命名您的节点,因为目前您正在尝试使用看起来尚未设置的 node.name

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多