Един 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