Быстрый спрайт как кнопка, переключаемая - PullRequest
1 голос
/ 04 июня 2019

У меня проблемы с получением стандартного спрайта с возможностью переключения с помощью Sprite Kit Я не хочу использовать UIButton.

Я пытался связать код в переопределении func touchesBegan, но я в тупике. Я совсем не привык, и кнопки со спрайтекитом оказываются очень сложными.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if (!isEnabled) {
            return
        }
        isSelected = true
        if (targetTouchDown != nil && targetTouchDown!.respondsToSelector(actionTouchDown!)) {
            UIApplication.sharedApplication().sendAction(actionTouchDown!, to: targetTouchDown, from: self, forEvent: nil)
        }
    }

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

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Warner создает подкласс и делает его осязаемым.

import SpriteKit

protocol touchMe: NSObjectProtocol {
    func spriteTouched(box: TouchableSprite)
}

class TouchableSprite: SKSpriteNode {
weak var delegate: touchMe!

override init(texture: SKTexture?, color: UIColor, size: CGSize) {
    super.init(texture: texture, color: color, size: size)
    self.isUserInteractionEnabled = true
}

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

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    delegate.spriteTouched(box: self)
}
}

И назовите его в своем коде с помощью ...

let restart = TouchableSprite(imageNamed: "mine")
restart.delegate = self

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

class ViewController, touchMe

Обязательный метод.

func spriteTouched(box: TouchableSprite) {
    print("sprite touched")
}
0 голосов
/ 05 июня 2019

Если вы хотите использовать touchesBegan() (и нет никаких причин не делать этого), вам нужно понимать, что это срабатывает при каждом касании экрана.Итак, что вам нужно сделать, это получить местоположение (координаты) касания и посмотреть, есть ли там спрайт:

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

    for touch in touches {
        let touchedSprite = selectNodeForTouch(touch.location(in: self))

        if let sprite= touchedSprite {
           sprite.changeColour()
           sprite.sendData(to: array1)
           sprite.senddata(to: array2)
        }
    }
}

// Returns the sprite where the user touched the screen or nil if no sprite there
func selectNodeForTouch(_ touchLocation: CGPoint) -> SKSpriteNode? {
    let touchedNode = self.atPoint(touchLocation) // Get the node at the touch point
    return (touchedNode is SKSpriteNode) ? (touchedNode as! SKSpriteNode) : nil
}

Итак, мы смотрим на местоположение касания, получаем узел в этомlocation и если узел является узлом SKSpriteNode, мы запускаем на нем наши функции changeColour() и sendData().

...