Ошибка SKScene + TouchBegan

У меня есть SKScene с 1 пустым узлом (buttonsGroup). В моем классе GameView я создаю узел (ball1), который является его родителем пустого узла.

    buttonsGroup = childNodeWithName("ball1")


    var ball1 = SKSpriteNode(imageNamed: "ball")
    ball1.name == "ball1"
    buttonsGroup.addChild(ball1)

Моя проблема возникает, когда я пытаюсь переместить узел с помощью TouchesBegan:

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

    for touch in (touches as! Set<UITouch>) {

        let location = touch.locationInNode(self)
        let touchNode = nodeAtPoint(location)

        if touchNode.name != "ground" {
            touchNode.position = location
        }
    }
} 

Я уже знаю, что если вы используете SKScene и местоположение touchNode, они вернут разные значения (по крайней мере, так кажется). В этом случае узел просто прыгает в никуда. Размер моей SKScene 480x320.

Кто-нибудь знает решение? Если я делаю вручную (без SKScene), все работает без проблем. У меня уже была эта проблема несколько раз, когда я пытался использовать действие moveBy или любое другое действие, требующее моей позиции в представлении.


person Gusfat    schedule 26.08.2015    source источник
comment
что такое группа кнопок? попробуйте заменить self.addChild(ball1) на buttonsGroup.addChild(ball1)   -  person Shoaib    schedule 26.08.2015
comment
buttonsGroups — это пустой узел, который я создал в SKScene.   -  person Gusfat    schedule 27.08.2015


Ответы (1)


Если вы пытаетесь переместить мяч, вам нужно будет преобразовать местоположение касания из координат сцены в координаты родителя мяча с помощью convertPoint:toNode или convertPoint:fromNode.

Например,

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch in (touches as! Set<UITouch>) {
        let location = touch.locationInNode(self)
        let node = nodeAtPoint(location)
        if (node.name != "ground") {
            let locationInNode = convertPoint(location, toNode:node.parent!)
            node.position = locationInNode
        }
    }
}
person 0x141E    schedule 26.08.2015
comment
Идеальный! Но все же зачем вам это нужно? Кажется логичным, что даже если у узла есть родитель, его позиция должна быть относительно сцены, а не его родителя. - person Gusfat; 27.08.2015