Один Swift SpriteNode для приближения к другому

У меня есть 2 узла спрайта. один игрок (красный) и еще один объект (зеленый). кроме того, есть невидимая область, которую я использую для обнаружения столкновений.

Мое намерение состоит в том, чтобы зеленые объекты приближались к красному игроку, как только игрок оказывается внутри синего прямоугольника.

введите здесь описание изображения

До сих пор я настраивал обработку столкновений таким образом, что SKAction срабатывает, когда игрок сталкивается с синей областью. SKAction перемещает зеленый объект на позицию игрока. Этот подход работает до тех пор, пока я не работаю с изменениями текстур, которые обрабатываются с помощью SKActionForever.

Вот мой код, который у меня есть:

                    let distance: CGFloat = fabs(platformNode1.position.x - player.position.x);                        
                    let moveToPlayer = SKAction.move(to: CGPoint(x: player.position.x, y: platformNode1.position.y), duration: Double(distance/10))                        
                    let passengerAnimation = SKAction.group([moveToPlayer, animatePassengerAction])
                    animatePassengerAction = SKAction.repeatForever(SKAction.animate(with: passengerAnimation, timePerFrame: 0.1))
                    let removePassenger = SKAction.removeFromParent()                        
                    let setPassengerToOnBoard = SKAction.run({ () -> Void in
                        self.passengerOnBoard = true
                    })                        
                    let onBoardActionSequence = SKAction.sequence([passengerAnimation, removePassenger, setPassengerToOnBoard])                        
                    self.passenger.run(onBoardActionSequence, withKey: "isOnboarding")

Моя проблема не в том, что последовательность SKAction никогда не завершается, так как последовательность зацикливается "passengerAnimation" до бесконечности. Но мне эта анимация нужна навсегда, поскольку она представляет собой анимацию идущего пассажира/объекта, которая должна повторяться до тех пор, пока объект приближается к игроку.

Кто-нибудь знает, как решить эту проблему? Я действительно застрял.


person boehmatron    schedule 05.02.2017    source источник


Ответы (1)


Поскольку вы знаете время в пути или движение пассажира, вы должны быть в состоянии вычислить необходимое количество циклов и настроить анимацию на это (и тогда вам не нужно будет повторять вечно)

Например:

let distance: CGFloat = fabs(platformNode1.position.x - player.position.x);                        
let moveToPlayer = SKAction.move(to: CGPoint(x: player.position.x, y: platformNode1.position.y), duration: Double(distance/10))                        

// distance/10 seconds * 0.1 second perFrame = distance number of frames.
// build a (repeating) array of the original animation frames with exactly the right number of frames for the distance.
let animationOnDistance = (0..<distance).map{passengerAnimation[$0 % passengerAnimation.count]}

let animatePassengerAction = SKAction.animate(with: animationOnDistance, timePerFrame: 0.1)

let passengerAnimation = SKAction.group([moveToPlayer, animatePassengerAction])
person Alain T.    schedule 28.03.2017