Swift спрайт как переключаемая кнопка

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

Я попытался связать код в функции переопределения 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)
        }
    }

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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")
}

спасибо за ответ! Я чувствую, что прохожу через свифт, лол. Я получаю сообщение об ошибке на restart.delegate = self ... там написано «ожидаемое объявление», хотя оно находится прямо под предоставленным вами объявлением. Кроме того, при перезапуске он используется, чтобы сделать возможным эффект переключения? Я предполагаю, что он вызывается при втором касании, верно?

Warner Scheibe 04.06.2019 22:45

Переменная делегата объявлена ​​в классе спрайтов Touchable? Проверить там?

user3069232 06.06.2019 06:45

Если вы хотите использовать 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
}

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

Другие вопросы по теме