Ios 斯威夫特中精灵速度变化的问题
我在SpriteKit中工作,我有一个数组中的随机精灵,使用SKActions以一定的速度和频率从屏幕顶部向下移动。我试图创造一个慢动作效果,使这些下落的精灵看起来下降得更慢,但继续以相同的距离下落,然后在五秒钟后恢复速度。更改精灵速度几秒钟后出现问题,一些精灵彼此之间的距离越来越近,这表明每次向下移动之间的时间发生了变化。我不确定是否有太多的定时动作同时发生,而精灵速度的变化会影响这些动作Ios 斯威夫特中精灵速度变化的问题,ios,swift,performance,sprite-kit,skaction,Ios,Swift,Performance,Sprite Kit,Skaction,我在SpriteKit中工作,我有一个数组中的随机精灵,使用SKActions以一定的速度和频率从屏幕顶部向下移动。我试图创造一个慢动作效果,使这些下落的精灵看起来下降得更慢,但继续以相同的距离下落,然后在五秒钟后恢复速度。更改精灵速度几秒钟后出现问题,一些精灵彼此之间的距离越来越近,这表明每次向下移动之间的时间发生了变化。我不确定是否有太多的定时动作同时发生,而精灵速度的变化会影响这些动作 let spriteArray = [SKSpriteNode]() let movingArray
let spriteArray = [SKSpriteNode]()
let movingArray = [SKSpriteNode]()
var slowMotion = false
override func didMove(to view: SKView) {
func createSprites()
func moveSprite()
}
func createSprites(){
for _ in 0...10 {
let sprite = SKSpriteNode(color: .red, size: CGSize(width: 10, height: 10)
sprite.position = CGPoint(x: self.size.width/2, y: self.size.height + sprite.size.height)
sprite.zPosition = 1
self.addChild(sprite)
spriteArray.append(sprite)
}
}
func moveSprite(){
let sprite = spriteArray.randomElement()
spriteArray.remove(at: spriteArray.firstIndex(of: sprite))
movingArray.append(sprite)
if slowMotion == true {
sprite.speed = 0.5
}
let moveSprite = SKAction.moveTo(y: -self.size.height * 0.1, duration: 3)
let returnSprite = SKAction.run { [weak self] in
guard let self = self else { return }
sprite.speed = 1
sprite.removeAllActions()
sprite.position.y = CGFloat(self.size.height + sprite.size.height)
self.spriteArray.append(sprite)
self.movingArray.remove(at: self.movingArray.firstIndex(of: sprite))
}
let spriteSequence = SKAction.sequence([moveSprite, returnSprite])
sprite.run(spriteSequence, withKey: "movingDown")
let wait = SKAction.wait(forDuration: 1 )
let moveNextSprite = SKAction.run {
[weak self] in
guard let self = self else { return }
self.moveSprite()
}
self.run(SKAction.sequence([wait, moveNextSprite])
}
func slowMotion(){
let slowDown = SKAction.run {
[weak self] in
guard let self = self else { return }
self.slowMotion = true
for sprite in self.movingArray{
sprite.speed = 0.5
sprite.action(forKey: "movingDown")?.speed = 0.5
}
}
let wait = SKAction.wait(forDuration: 5)
let resumeSpeed = SKAction.run {
[weak self] in
guard let self = self else { return }
self.slowMotion = false
for sprite in self.movingArray{
sprite.speed = 1
sprite.action(forKey: "movingDown")?.speed = 1
}
}
let slowMotionSequence = SKAction.sequence([slowDown, wait, resumeSpeed])
world.run(slowMotionSequence, withKey: "slowMotion")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch: AnyObject in touches {
if slowMotion == false {
slowMotion()
}
}
}
让spriteArray=[SKSpriteNode]()
让movingArray=[SKSpriteNode]()
var slowMotion=false
覆盖func didMove(到视图:SKView){
func createSprites()
func moveSprite()
}
func createSprites(){
对于0…10中的uu{
设sprite=SKSpriteNode(颜色:。红色,尺寸:CGSize(宽度:10,高度:10)
sprite.position=CGPoint(x:self.size.width/2,y:self.size.height+sprite.size.height)
sprite.zPosition=1
self.addChild(精灵)
spriteArray.append(精灵)
}
}
func moveSprite(){
设sprite=spriteArray.randomElement()
移除(位于:spriteArray.firstIndex(of:sprite))
movingArray.append(精灵)
如果slowMotion==true{
sprite.speed=0.5
}
让moveSprite=SKAction.moveTo(y:-self.size.height*0.1,持续时间:3)
让returnSprite=SKAction.run{[weak self]在
guard let self=self-else{return}
sprite.speed=1
sprite.removeAllActions()
sprite.position.y=CGFloat(self.size.height+sprite.size.height)
self.spriteArray.append(精灵)
self.movingArray.remove(位于:self.movingArray.firstIndex(of:sprite))
}
让spriteSequence=SKAction.sequence([moveSprite,returnSprite])
sprite.run(spriteSequence,带键:“下移”)
let wait=SKAction.wait(持续时间:1)
让moveNextSprite=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.moveSprite()
}
self.run(SKAction.sequence([wait,moveNextSprite])
}
func slowMotion(){
让减速=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.slowMotion=true
为了在自我移动阵列中的精灵{
sprite.speed=0.5
精灵。动作(福克斯:“下移”)?。速度=0.5
}
}
let wait=SKAction.wait(持续时间:5)
让resumeSpeed=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.slowMotion=false
为了在自我移动阵列中的精灵{
sprite.speed=1
精灵。动作(福克斯:“下移”)?。速度=1
}
}
让slowMotionSequence=SKAction.sequence([减速、等待、恢复速度])
world.run(慢动作序列,带键:“慢动作”)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
用于触摸:触摸中的任何对象{
如果slowMotion==false{
慢动作
}
}
}