0

ユーザーに特定のスプライトを画面上でドラッグアンドドロップさせようとしています。これについて私が見た答えは、スプライトの名前をチェックすることです(以下のようなもの)。これを行うためのより良い方法があるはずです。ご意見ありがとうございます。

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
        }
    }
}
4

1 に答える 1

2

特定のスプライトのみをドラッグ アンド ドロップしたいので、それらを識別する方法が必要です。これは、ノードを区別するために使用できるものであれば何でもかまいません。以下は、このコンテキストで使用できるものに関するいくつかの提案です。

回答のコードは Objective-C です。Swift に翻訳できることを願っています。

nameプロパティ_

あなたが言ったように、これはスプライトをドラッグできるかどうかを決定する最も一般的に使用される方法です。

userDataプロパティ_

これは、必要なカスタム データを設定できる SKNode に関連付けられたプロパティです。ここでそれについて読むことができます。

[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"])
于 2014-07-21T06:46:34.530 に答える