我需要检测用户是否点击了精灵节点。
在这里我创建了精灵节点:
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,看起来它还没有设置。