Изменение позиций SKSpritenode через SKAction

swift
spritekit

#1

Всем Привет! У меня есть функция, которая через жесты, записывает последовательность перемещений через буквы в строку, которые должен совершить спрайт . А также функция touchesEnded(_ touches: Set, with event: UIEvent?), которая считывает эту же строку по первой букве. Вот часть кода:

 while word != ""{
            if word[word.startIndex] == "R"   {
                let  moveSpriteToRight = SKAction.move(to: CGPoint(x: sprite.position.x+128, y: sprite.position.y), duration: 1)
                 sprite.run(moveSpriteToRight)                                
                            } else if word == "D" {
                let moveSpriteToDown = SKAction.move(to: CGPoint(x: sprite.position.x, y: sprite.position.y-128), duration: 1)              
                sprite.run(moveSpriteToDown)              
                            } else if word == "L" {
                let moveSpriteToLeft = SKAction.move(to: CGPoint(x: sprite.position.x-128, y: sprite.position.y), duration: 1)
                sprite.run(moveSpriteToLeft)            
                           } else if word == "U" {
                let moveSpriteToUp = SKAction.move(to: CGPoint(x: sprite.position.x, y: sprite.position.y+128), duration: 1)              
                sprite.run(moveSpriteToUp)        
                            }
            word.remove(at: word.startIndex)}

Simulator выполняет только последний SKAction, а по задумке, хотелось бы, чтобы Sprite проделал большой путь. К примеру, если word = “ULD”,то спрайт должен перемещаться по траектории сначала вверх(Up) , затем влево(Left) и вниз(Down). И каждый раз через жесты пользователь создает новые траектории, прекращение записи жестов происходит через touchesEnded. Спрайт их должен выполнять каждый раз.


#2

тебе надо немного логику изменить, на данный момент у тебя при переборе всех букв в массиве всегда будет выполняться последнее действие. Тебе необходимо например раз в секунду брать первый элемент в массиве, удалять его и выполнять анимацию.
И перенеси код на emun и switch, легче будет читаться


#3

А каким мне способом держать переменную на 1 секунду? Вот так пробовал , не работает
while combo != “”{
timerSprite.invalidate()
timerSprite = Timer.scheduledTimer(timeInterval: 0.9, target: self, selector: #selector(spriteMove), userInfo: nil, repeats: true)
}
timerSprite.invalidate()

func spriteMove(){
if word[word.startIndex] == “R” {
let moveSpriteToRight = SKAction.move(to: CGPoint(x: sprite.position.x+128, y: sprite.position.y), duration: 1)
sprite.run(moveSpriteToRight)
} else if word == “D” {
let moveSpriteToDown = SKAction.move(to: CGPoint(x: sprite.position.x, y: sprite.position.y-128), duration: 1)
sprite.run(moveSpriteToDown)
} else if word == “L” {
let moveSpriteToLeft = SKAction.move(to: CGPoint(x: sprite.position.x-128, y: sprite.position.y), duration: 1)
sprite.run(moveSpriteToLeft)
} else if word == “U” {
let moveSpriteToUp = SKAction.move(to: CGPoint(x: sprite.position.x, y: sprite.position.y+128), duration: 1)
sprite.run(moveSpriteToUp)
}
word.remove(at: word.startIndex)}