使用swift拖动精灵而不使用硬编码名称

时间:2014-07-20 23:20:31

标签: swift sprite-kit ios8 skspritenode sknode

我只是想让用户在屏幕上拖放某些精灵。我看到的答案是检查精灵的名称(如下所示)。必须有更好的方法来做到这一点。感谢您的任何意见。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    var nodeTouched = SKNode()
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        nodeTouched = self.nodeAtPoint(location)

        if(nodeTouched.name? == "character") {
            character.position=location
            currentNodeTouched = nodeTouched
        } else {
            currentNodeTouched.name = ""
        }
    }
}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        var nodeTouched = SKNode()
        nodeTouched = self.nodeAtPoint(location)

        if(currentNodeTouched.name == "character") {
            character.position = location
        }
    }
}

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        var nodeTouched = SKNode()
        nodeTouched = self.nodeAtPoint(location)

        if(currentNodeTouched.name == "character") {
            character.position = location
        }
    }
}

1 个答案:

答案 0 :(得分:2)

由于您只想拖放特定的精灵,因此必须有一种识别精灵的方法。这可以是可用于区分节点的任何东西。以下是关于在这种情况下可以使用什么的一些建议。

答案中的代码在Objective-C中,希望你能将它翻译成Swift。

name属性

正如您所说,这是确定是否可以拖动精灵的最常用方法。

userData属性

这是与SKNode相关联的属性,可让您设置所需的任何自定义数据。你可以阅读它here

[node.userData setValue:@(YES) forKey:@"draggable"]; //Setting the value

if ([[node.userData valueForKey:@"draggable"] boolValue]) //Checking the value

<强>子类

您还可以创建一个自定义类,它可以自己处理deag-drop功能,也可以将BOOL实现为可以在触摸代理中检查的属性。

班级名称

在某些情况下,您可能只想拖动特定类的节点。

if ([node isKindOfClass:[CustomNode class]])

if ([(NSStringFromClass([node class]) isEqualToString:@"CustomNode"])