У меня возникли проблемы с получением возможности переключения стандартного спрайта с помощью 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)
}
}
Я хочу нажать на спрайт, чтобы он изменил цвет и отправил данные в два разных массива. У меня есть опыт работы с массивами на других языках, поэтому мне не нужна помощь, просто нужно принять касание.





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")
}
Переменная делегата объявлена в классе спрайтов Touchable? Проверить там?
Если вы хотите использовать 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().
спасибо за ответ! Я чувствую, что прохожу через свифт, лол. Я получаю сообщение об ошибке на restart.delegate = self ... там написано «ожидаемое объявление», хотя оно находится прямо под предоставленным вами объявлением. Кроме того, при перезапуске он используется, чтобы сделать возможным эффект переключения? Я предполагаю, что он вызывается при втором касании, верно?