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)
}
,而不必每次加载纹理,在阵列一旦缓存纹理,例如用于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")
还有一件事,如果你可以请帮助我...当用户输了,或者应用程序进入背景......等等这些功能仍然在创建节点,最终导致崩溃。有没有办法阻止他们没有重新设置游戏? – 2015-02-12 20:45:32
当应用程序进入后台时,“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)
你为什么要使用一个NSTimer?它不适合sprite套件。改用waitForDuration来使用SKAction? – rakeshbs 2015-02-11 01:43:14
,你能解释一下你在代码中试图做什么吗? – rakeshbs 2015-02-11 01:45:16
嗨@rakeshbs我想每x秒调用一次这个函数来产生新的随机大小障碍物。如果我使用repeatActionForever,那么它将只使用第一次生成的相同randomMountain,而不是重新生成新的。你能告诉我如何.waitForDuration会改变? – 2015-02-11 02:13:29