Как обнаружить касания на skspritenode, созданных в отдельной сцене, используя пользовательский класс этого узла

Так что в основном у меня есть узел, называемый деревом, и я создал его в файле.sks.

Я добавил специальный класс для skspritenode, но пользовательский класс, похоже, не влияет на узел.

Я пытаюсь обнаружить касания узла и его детей.

Этот узел переносится в несколько сцен с помощью removefromparent() и addchild() поэтому вместо того, чтобы писать дубликат кода на каждой сцене, чтобы обнаружить касание, я пытаюсь использовать класс пользовательских узлов для этого... любая помощь будет оценена,

Заметьте, что у меня есть функция super.init с текстурой, как это необходимо, но я хотел бы использовать узел, который уже был создан в сцене.

Мой код класса

import SpriteKit

class tree: SKSpriteNode {

    init() {
        let texture = SKTexture(imageNamed: "tree")
        super.init(texture: texture, color: SKColor.clear, size: texture.size())
        self.isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            print("touched!")
        }
    }



}
+1
14 янв. '17 в 2:09
источник поделиться
1 ответ

В этом ответе есть хорошее объяснение, которое должно быть понятно вашим идеям о файлах SKS и подклассификации. О вашем коде это хорошая привычка использовать прописную букву для имен классов, в вашем случае я предпочитаю использовать class Tree вместо дерева классов. Что касается второй проблемы, вы можете использовать userData для переноса объекта из сцены в другую, как описано ниже в моем примере:

import SpriteKit
class GameScene: SKScene {
    private var label : SKLabelNode?
    var tree : Tree!
    override func didMove(to view: SKView) {
        self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
        if let label = self.label {
            label.alpha = 0.0
            label.run(SKAction.fadeIn(withDuration: 2.0))
        }
        self.isUserInteractionEnabled = true
        tree = Tree()
        tree.name = "tree"
        addChild(tree)
        tree.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let nodeUserTapped = atPoint(pointOfTouch)
            if nodeUserTapped.name == "tree" {
                tree.removeFromParent()
                let sceneToMoveTo = Scene2.init(size: self.size)
                sceneToMoveTo.userData = NSMutableDictionary()
                sceneToMoveTo.userData?.setObject(tree, forKey: "tree" as NSCopying)
                let gameTransition = SKTransition.fade(withDuration: 0.5)
                self.view!.presentScene(sceneToMoveTo, transition: gameTransition)

            }
        }
    }
}
class Scene2: SKScene {
    var tree:Tree!
    override func didMove(to view: SKView) {
        print("This is the scene: \(type(of:self))")
        guard let previousValue = self.userData?.value(forKey: "tree") else { return }
        if previousValue is Tree {
            tree = previousValue as! Tree
            addChild(tree)
            tree.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
        }
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let nodeUserTapped = atPoint(pointOfTouch)
            if nodeUserTapped.name == "tree" {
                tree.removeFromParent()
                if let sceneToMoveTo = SKScene(fileNamed: "GameScene") {
                    sceneToMoveTo.scaleMode = .aspectFill
                    sceneToMoveTo.userData = NSMutableDictionary()
                    sceneToMoveTo.userData?.setObject(tree, forKey: "tree" as NSCopying)
                    let gameTransition = SKTransition.fade(withDuration: 0.5)
                    self.view!.presentScene(sceneToMoveTo, transition: gameTransition)
                }
            }
        }
    }
}

Как вы можете прочитать Я управление касаниями как в моем родительском классе и в моем узле, это может быть возможным за счет изменения touchesBegan метод пользовательских SKSpriteNode как:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        print("touched!")
    }
    guard let parent = self.parent else { return }
    parent.touchesBegan(touches, with: event)
}

Помните, что вы должны расширить этот подход и на другой метод касаний, если хотите их использовать.

+2
14 янв. '17 в 10:56
источник

Посмотрите другие вопросы по меткам или Задайте вопрос