Как получить имя SKSpriteNode?

Я работаю с этим кодом, который я нашел, и пытаюсь понять, как получить имена узлов для моих объектов?

Вот часть кода:

let sprite1 = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 30, height: 30))
let sprite2 = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 30, height: 30))
let sprite3 = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 30, height: 30))
let sprite4 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 30, height: 30))

var selected: [UITouch: SKNode] = [:]

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    selected = [:]
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        selected[touch as UITouch] = nodeAtPoint(location)

        println(self.name)
    }
}

Чего я пытаюсь добиться, так это заставить println вернуть имя SKSprintNode (sprite1, sprite2, sprite3 или sprite4)... Я пробовал несколько вещей, но все, что я получаю, это ´nil´.

Это возможно?

Добавлено:

Итак, чтобы продолжить, как я могу определить, находится ли прикосновение внутри моих объектов? Вот еще код:

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

        for (touch, node) in selected{
            if !contains(SKScene, node){
                let action = SKAction.moveTo(location, duration: 0.1)
                node.runAction(SKAction.repeatAction(action, count: 1))
            }
        }

    }
}

С if !contains(SKScene, node) (который не работает, не могу проверить на SKScene) я хочу определить, было ли прикосновение к объекту или снаружи.. Если снаружи (касание - это SKScene), я не хочу ничего делать.

Причина, по которой я хочу сделать это таким образом, а не тестировать имена let, например sprite1, заключается в том, что я планирую сделать все SKSpriteNode программно, поэтому мне не обязательно знать имя узла-объекта.

Какие-либо предложения?


person Kjetil    schedule 03.12.2014    source источник
comment
Хорошо, ближе :-D Нашел, как исправить оператор if: if !contains([self], node)... Это работает! Но правильно ли это?   -  person Kjetil    schedule 04.12.2014
comment
Также переместил код под touchesEnded в touchesMoved , так что теперь блоки (объекты) плавно следуют за прикосновением к экрану :-D   -  person Kjetil    schedule 04.12.2014


Ответы (1)


Вы устанавливаете имя переменной, но не устанавливаете имя SKSpriteNode. Так должно быть:

 sprite1.name = @"sprite1";

Следуйте примеру для остальных ваших спрайтов.

Еще я заметил, что вы называете self.name. Я почти уверен, что self относится к сцене, если именно там находится этот код. Вместо этого вы должны сохранить выбранный как SKSpriteNode и вызвать selected.name.

person meisenman    schedule 03.12.2014
comment
Хорошо, понятно... self.name был лишь одним из многих способов, которые я пробовал ;-) Здесь я пытаюсь понять, как я могу определить, к какому узлу я прикасаюсь. Код работает, но я не могу понять почему :-o - person Kjetil; 04.12.2014
comment
Ok. Поэтому, когда вы что-то касаетесь, вы указываете Selected на затронутый узел (если он есть). Затем вы возвращаете имя узла, на которое указывает Selected name. Это дает вам доступ к вашим SKSpriteNodes, просто коснувшись одного из них. Если вы хотите выполнить код при касании определенных узлов, вам нужно проверить, равно ли Selected node.name узлу, который вы проверяете, если он коснулся. Если это так, запустите код. Это произойдет сразу после установки выбранного узла. - person meisenman; 04.12.2014
comment
Юпп, что касается другого сообщения, на которое вы ответили; надо было написать так: sprite1.name = "sprite1" - person Kjetil; 04.12.2014