2015-02-11 136 views
0

嗨我有一個行動序列,永遠運行,在側面滾動遊戲中生成障礙。但不是從我的紋理生成隨機圖片和高度,它保持它第一次運行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

回答

1

,而不必每次加載紋理,在陣列一旦緩存紋理,例如用於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

0

@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)