精灵节点不检测触摸



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

在这里我创建了精灵节点:

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!")          
}

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

在创建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节点,但该节点应该在触摸中可见

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

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

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

因此,根据您发布的代码,我认为您必须正确设置节点的名称,以便在touchesBegan方法中检查它。只需在创建敌人后立即在didMoveToView方法中命名您的节点,因为当前您正试图使用node.name,看起来它还没有设置。

最新更新