Как определить, что SKSpriteNode был затронут

Я нахожу аналогичный вопрос, но я пытаюсь обнаружить и определить, к какому Sprite пользователь прикасается, и я не знаю, как это сделать. Это моя переменная:

var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]

Идея состоит в том, чтобы идентифицировать spriteNode, а затем заменить его на другой спрайт или изменить цвет, но я не знаю, как это сделать с помощью этой матрицы spriteNodes, я предполагаю, что на первом этапе он идентифицирует спрайт.

Я очень ценю вашу помощь! Спасибо!

+3
источник поделиться
2 ответа

То, что вы пытаетесь сделать (даже если я не вижу причины для этого), может быть выполнено с помощью delegation шаблона. В принципе, вы сообщите своему делегату (сценарию или тому, что вы указали как делегат), чтобы что-то сделать для вас, и вы сделаете это непосредственно из метода кнопки touchesBegan. Кроме того, вы передадите имя кнопки в сцену.

Чтобы это произошло, сначала вы должны определить протокол под названием ButtonDelegate. Этот протокол определяет требование, в котором говорится, что любой соответствующий класс должен реализовать метод с именем printButtonsName(_:):

protocol ButtonDelegate:class {

   func printButtonsName(name:String?)
}

Это метод, который будет реализован в вашем классе GameScene, но вызван из кнопки touchesBegan. Кроме того, этот метод будет использоваться для передачи имени кнопки для его делегата (сцены), поэтому вы всегда будете знать, какая кнопка нажата.

Следующее - сам класс кнопки. Button может выглядеть так:

class Button : SKSpriteNode{

    weak var delegate:ButtonDelegate?

    init(name:String){
        super.init(texture: nil, color: .purpleColor(), size: CGSize(width: 50, height: 50))
        self.name = name
        self.userInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        delegate?.printButtonsName(self.name)
    }  
}

Важная вещь здесь userInteractionEnabled = true, что означает, что кнопка будет принимать штрихи. Еще одна важная вещь - свойство delegate. Как уже упоминалось, кнопки будут иметь сцену, установленную как ее делегат. Настройка сцены в качестве делегата кнопок будет выполнена позже, когда мы создадим несколько кнопок... Чтобы сделать это проще для вас, подумайте о делегате как работнике, который работает для своего босса:) Босс (кнопка) говорит своему работнику ( сцена), чтобы что-то сделать для него (чтобы напечатать его имя).

Хорошо, поэтому давайте удостовериться, что сцена соответствует протоколу ButtonDelegate... Почему это важно? Это важно, потому что рабочий (сцена) должен следовать указаниям своего босса (кнопка). Соблюдая этот протокол, рабочий заключает контракт со своим начальником, который подтверждает, что он знает, как выполнять свою работу и будет выполнять свои приказы:)

class GameScene: SKScene, ButtonDelegate {


    override func didMoveToView(view: SKView) {

        let play = Button(name:"play")
        play.delegate = self
        let stop = Button(name:"stop")
        stop.delegate = self

        play.position = CGPoint(x: frame.midX - 50.0, y: frame.midY)
        stop.position = CGPoint(x: frame.midX + 50.0, y: frame.midY)

        addChild(play)
        addChild(stop)
    }

    func printButtonsName(name: String?) {

        if let buttonName = name {
            print("Pressed button : \(buttonName) ")
        }

        //Use switch here to take appropriate actions based on button name (if you like)
    }
}

И что это. Когда вы нажмете кнопку воспроизведения, будет вызываться touchesBegan на самой кнопке, затем кнопка сообщит ее делегату для печати своего имени, используя метод, определенный внутри класса сцены.

+9
источник

Сначала вам нужен другой способ создания спрайта, вот как это сделать:

let spriteA = SKSpriteNode(imageNamed: "a")
scene.addChild(spriteA)
let spriteB = SKSPriteNode(imageNamed: "b")
scene.addChild(spriteB)
...and so on...

Теперь нам нужно задать имя для спрайта, чтобы мы могли узнать, какой node будет использован позже. Чтобы добавить имя для спрайта, просто выполните следующее:

spriteNode.name = "name of the sprite"

Ввод этого кода в приведенный выше пример будет выглядеть примерно так:

let spriteA = SKSpriteNode(imageNamed: "a")
spriteA.name = "a"
scene.addChild(spriteA)
let spriteB = SKSPriteNode(imageNamed: "b")
spriteB.name = "b"
scene.addChild(spriteB)
...and so on...

Чтобы обнаружить касания, поместите это в свой подкласс SKScene:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch = touches.first as UITouch!
    let touchLocation = touch.locationInNode(self)
    let targetNode = nodeAtPoint(touchLocation) as! SKSpriteNode
}

targetNode - это node, который вы нажали.

Если вы хотите получить имя спрайта, вы можете использовать targetNode.name.

0
источник

Связанные вопросы


Похожие вопросы

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