Swift 精灵节点不检测触摸?

Swift 精灵节点不检测触摸?,swift,sprite-kit,Swift,Sprite Kit,我需要检测用户是否点击了精灵节点 在这里,我创建了sprite节点: 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.addC

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

在这里,我创建了sprite节点:

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)
在这里的
touchesbeated
中,我设置了用于检测触摸的变量:

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

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

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

在节点上使用userInteractionEnabled允许节点本身接收触摸。如果您决定这样做,您需要在特定的对象上实现touchesbreated:。但我想这不是一种情况,也不是你想要的。请注意,nodeAtPoint基于触摸位置(场景默认情况下接收触摸),它会告诉您在某个位置是否存在任何节点,而不管该节点是否接收触摸


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

在创建touchedNodeName变量时,enemy1节点的名称未设置name属性。移动

enemy1.name = "enemy1"
在紧接着创建节点时

enemy1 = SKSpriteNode(texture: enemy1Texture)
所以它变成了

enemy1 = SKSpriteNode(texture: enemy1Texture)
enemy1.name = "enemy1"
然后,当您触摸到node.name时,您可以检查它是否为“enemy1”

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

if(touchedNode.Name != nil){
     //Then get the .Name variable and perform your checks
}
在另一种方法中,您可以检查您按下的节点是否为enemy1节点,但该节点应在ToucheSBegind函数中可见,如下所示

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

您是对的-在didMoveToView中命名节点是问题的一半,另一半是我正在检查是否在已经满足的if-else语句末尾点击了节点,因此它没有运行用于触摸节点的代码。谢谢
if(touchedNode == enemy1){
    //Your code here
}