Как заставить спрайт изменить направление при нажатии?
При первом касании мой игрок начинает двигаться вверх по оси Y, и я настроил его так:
override func touchesBegan(...) {
if isMovingup == true {
let up = SKAction.moveByX(0, y: 900, duration: 9)
player.runAction(up)
}
else {
let down = SKAction.moveByX(0, y: -900, duration: 9)
player.runAction(down)
}
isMovingup = !isMovingup
}
Однако при повторном нажатии на узел мне бы хотелось, чтобы он двигался вниз по оси y, но на данный момент он просто ничего не делает. Разместим больше кода, если это необходимо.
3 ответа
Решение
Вам нужно остановить предыдущее действие с player.removeAllActions()
в противном случае ваши действия будут складываться.
override func touchesBegan(...) {
player.removeAllActions() //<-- Touching always causes the player to change direction, so lets cancel out the previous action before assigning a new one
if isMovingup == true {
let up = SKAction.moveByX(0, y: 900, duration: 9)
player.runAction(up)
}
else {
let down = SKAction.moveByX(0, y: -900, duration: 9)
player.runAction(down)
}
isMovingup = !isMovingup
}
Выглядит так, как будто ваш булев флип находится за пределами функции. Попробуйте переместить линию isMovingup = !isMovingup
внутрь последней фигурной скобки.
override func touchesBegan(...) {
if isMovingup {
let up = SKAction.moveByX(0, y: 900, duration: 9)
player.runAction(up)
}
else {
let down = SKAction.moveByX(0, y: -900, duration: 9)
player.runAction(down)
}
isMovingup = !isMovingup
}
Похоже, что кусок кода
isMovingup = !isMovingup
Определяется вне функции, поэтому он не запускается. Переместите его внутрь функции после оператора else, чтобы он запускался при каждом вызове функции
override func touchesBegan(...) {
if isMovingup == true {
let up = SKAction.moveByX(0, y: 900, duration: 9)
player.runAction(up)
}
else {
let down = SKAction.moveByX(0, y: -900, duration: 9)
player.runAction(down)
}
isMovingup = !isMovingup
}