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