我有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”直到永远。但我永远需要这个动画,因为这代表了行走的乘客/物体的动画,只要物体接近玩家,它就应该循环。
有谁知道如何解决这个问题?我真的被卡住了。
答案 0 :(得分:0)
由于您知道旅行时间或乘客的移动,您应该能够计算所需的周期数并将动画调整为(然后您不需要永远重复)< / p>
例如:
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])