SKAction不按预期工作

问题描述:

嗨我有一个行动序列,永远运行,在侧面滚动游戏中生成障碍。但不是从我的纹理生成随机图片和高度,它保持它第一次运行SKActions时产生的相同的那些...SKAction不按预期工作

有人可以解决这个问题吗?我尽量不使用

NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setUpMountains"), userInfo: nil, repeats: true) 

,因为它降低我的FPS出于某种原因

func setUpMountains() { 

    let gapHeight = user.size.height * 3 
    var movementAmount = arc4random() % UInt32(self.frame.size.height/3.0) 

    var randomNumber = arc4random() % 3 
    if randomNumber == 0 { 
     mountainTexture = SKTexture(imageNamed:"RedMountain.png") 
    } else if randomNumber == 1 { 
     mountainTexture = SKTexture(imageNamed:"OrangeMountain.png") 
    } else { 
     mountainTexture = SKTexture(imageNamed:"BeigeMountain.png") 
    } 
    var randomMountain = SKSpriteNode(texture: mountainTexture) 
    randomMountain.position = CGPointMake(CGRectGetMidX(self.frame) + self.frame.width, CGRectGetMidY(self.frame) - gapHeight - CGFloat(movementAmount)) 
    randomMountain.zPosition = 8 
    randomMountain.physicsBody = SKPhysicsBody(texture: mountainTexture, size: mountainTexture.size()) 
    randomMountain.physicsBody?.dynamic = false 
//  randomMountain.physicsBody?.categoryBitMask = objectCategory 
    movingObjects.addChild(randomMountain) 

    //spawning mountains 
    var distanceToMove = self.frame.size.width + mountainTexture.size().width 
    var moveMountain = SKAction.moveByX(-distanceToMove, y: 0, duration: NSTimeInterval (distanceToMove * 0.01)) 
    var replaceMountain = SKAction.moveByX(distanceToMove, y: 0, duration: 0) 
    //var removeMountain = SKAction.removeFromParent() 
    var moveAndRemoveMountain = SKAction.repeatActionForever(SKAction.sequence([moveMountain, replaceMountain])) 

    randomMountain.runAction(moveAndRemoveMountain) 

} 
+0

你为什么要使用一个NSTimer?它不适合sprite套件。改用waitForDuration来使用SKAction? – rakeshbs 2015-02-11 01:43:14

+0

,你能解释一下你在代码中试图做什么吗? – rakeshbs 2015-02-11 01:45:16

+0

嗨@rakeshbs我想每x秒调用一次这个函数来产生新的随机大小障碍物。如果我使用repeatActionForever,那么它将只使用第一次生成的相同randomMountain,而不是重新生成新的。你能告诉我如何.waitForDuration会改变? – 2015-02-11 02:13:29

,而不必每次加载纹理,在阵列一旦缓存纹理,例如用于mountains在下面的代码。

使用带有等待持续时间的SKAction sequence而不是NSTimer重复执行功能。

由于生成的障碍物在使用removeParent离开屏幕后将被移除,因此您不需要repeatActionForever动作。

var mountains : [SKTexture] = [] 

override func didMoveToView(view: SKView) { 

    mountains = [SKTexture(imageNamed:"RedMountain.png"),SKTexture(imageNamed:"OrangeMountain.png"),SKTexture(imageNamed:"BeigeMountain.png")] 

    let generateMountains = SKAction.runBlock {() -> Void in 
     self.setUpMountains() 
    } 
    let generateObstaclesPeriodically = SKAction.repeatActionForever (SKAction.sequence([generateMountains,SKAction.waitForDuration(4.0)])) 
    self.runAction(generateObstaclesPeriodically) 
} 


func setUpMountains() { 

    let gapHeight = user.size.height * 3 
    var movementAmount = arc4random() % UInt32(self.frame.size.height/3.0) 

    var randomNumber = arc4random() % 3 
    let mountainTexture = mountains[randomNumber] 

    var randomMountain = SKSpriteNode(texture: mountainTexture) 
    randomMountain.position = CGPointMake(CGRectGetMidX(self.frame) + self.frame.width, CGRectGetMidY(self.frame) - gapHeight - CGFloat(movementAmount)) 
    randomMountain.zPosition = 8 
    randomMountain.physicsBody = SKPhysicsBody(texture: mountainTexture, size: mountainTexture.size()) 
    randomMountain.physicsBody?.dynamic = false 
    movingObjects.addChild(randomMountain) 

    //spawning mountains 
    var distanceToMove = self.frame.size.width + mountainTexture.size().width 
    var moveMountain = SKAction.moveByX(-distanceToMove, y: 0, duration: NSTimeInterval (distanceToMove * 0.01)) 
    var removeMountain = SKAction.removeFromParent() 

    var moveAndRemoveMountain = SKAction.sequence([moveMountain, removeMountain]) 

    randomMountain.runAction(moveAndRemoveMountain) 

} 

要删除SKAction你可以给一个关键SKAction同时加入,并用钥匙从节点中删除。

self.runAction(generateObstaclesPeriodically, withKey: "generateObstaclesPeriodically") 
self.removeActionForKey("generateObstaclesPeriodically") 
+0

还有一件事,如果你可以请帮助我...当用户输了,或者应用程序进入背景......等等这些功能仍然在创建节点,最终导致崩溃。有没有办法阻止他们没有重新设置游戏? – 2015-02-12 20:45:32

+0

当应用程序进入后台时,“SKAction”会自动暂停,并在回到前台时恢复。检查我的更新答案以删除操作 – rakeshbs 2015-02-13 03:04:17

@rakeshbs感谢了很多,似乎工作,但我改成了这个,而不是

mountains = [SKTexture(imageNamed:"RedMountain.png"),SKTexture(imageNamed:"OrangeMountain.png"),SKTexture(imageNamed:"BeigeMountain.png")] 

    let generateMountains = SKAction.runBlock {() -> Void in 
     self.setUpMountains() 
    } 
    let generateObstaclesPeriodically = SKAction.repeatActionForever(SKAction.sequence([generateMountains,SKAction.waitForDuration(4.0)])) 
    self.runAction(generateObstaclesPeriodically)