Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sprite kit 一个敏捷的SpriteNode接近另一个_Sprite Kit_Swift3 - Fatal编程技术网

Sprite kit 一个敏捷的SpriteNode接近另一个

Sprite kit 一个敏捷的SpriteNode接近另一个,sprite-kit,swift3,Sprite Kit,Swift3,我有两个精灵节点。一个是玩家(红色),还有另一个对象(绿色)。此外,还有一个不可见区域,我用于碰撞检测 我的意图是,只要玩家在蓝色矩形内,绿色对象就会接近红色玩家 直到现在,我设置碰撞处理的方式是当玩家与蓝色区域碰撞时触发SKAction。SKAction将绿色对象移动到玩家的位置。只要我不处理纹理更改,这种方法就可以工作,而纹理更改是用SKActionForever处理的 以下是我的代码: let distance: CGFloat = fabs(pl

我有两个精灵节点。一个是玩家(红色),还有另一个对象(绿色)。此外,还有一个不可见区域,我用于碰撞检测

我的意图是,只要玩家在蓝色矩形内,绿色对象就会接近红色玩家

直到现在,我设置碰撞处理的方式是当玩家与蓝色区域碰撞时触发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”直到永远。但我永远需要这个动画,因为它代表了步行乘客/对象的动画,只要对象接近播放器,就应该循环


有人知道如何解决这个问题吗?我真的被卡住了。

因为你知道旅行时间或乘客的移动,你应该能够计算出所需的循环次数,并将动画调整到这一点(这样你就不需要永远重复)

例如:

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])
let distance:CGFloat=fabs(platformNode1.position.x-player.position.x);
让moveToPlayer=SKAction.move(到:CGPoint(x:player.position.x,y:platformNode1.position.y),持续时间:双倍(距离/10))
//距离/10秒*0.1秒每帧=距离帧数。
//构建一个(重复)原始动画帧数组,该数组中的帧数与距离完全匹配。
让animationInstance=(0。。