目的:
我有粒子从屏幕顶部掉下来,我希望他们提高速度,因为得分达到一定值。
以前失败的尝试:
我首先使那些落下的粒子受到重力影响,并试图在分数达到一定值时增加重力值。然而它似乎没有用,所以我认为在游戏中不能改变引力。
现状:
经过一些研究,我想到了使用两个全球NSTimers,slowTimer
和fastTimer
。在slowTimer
中调用didMoveToView
。在touchesBegan
中,每次有一个点按,我都会调用一个函数,即changeSpeed:
func changeSpeed()
{
if score >= 2
{
slowTimer.invalidate()
makeWallsDividerT = 300
fastTimer = NSTimer.scheduledTimerWithTimeInterval(1.4, target: self, selector: Selector("makeWalls"), userInfo: nil, repeats: true)
}
}
makeWallsDividerT
是function makeWalls
中的一个变量,由fastTimer
调用。
当前情况的问题:
当游戏结束并且所有内容都重置时,我会fastTimer.invalidate()
并且仍然存在问题,因为它没有重置为slowTimer。此外,似乎两个计时器都在重置后开启,游戏比fastTimer快得多。
请指点什么?或任何其他方式来实现我想要做的事情? 谢谢!
答案 0 :(得分:2)
NSTimer
的替代方法是使用SKAction
。
SKAction *wait = [SKAction waitForDuration:1.0f];
答案 1 :(得分:2)
问题是你根本不应该在NSTimers
中使用SpriteKit
。
使用SKAction
:
runAction(
SKAction.sequence([
SKAction.waitForDuration(1.4),
SKAction.runBlock({
self.makeWalls()
})
])
)
答案 2 :(得分:2)
要重新编写代码,以便不再使用NSTimers,您需要执行以下操作:
override func didMoveToView(view:SKView)
{
let spawnWall = SKAction.runBlock({[unowned self] in self.makeWalls();});
let sequence = SKAction.sequence([SKAction.waitForDuration(3),spawnWall])
let repeatForever = SKAction.repeatActionForever(sequence);
self.runAction(repeatForver, withKey:"makeWalls");
}
func changeSpeed()
{
if score >= 2
{
self.removeActionForKey("makeWalls");
makeWallsDividerT = 300;
let spawnWall = SKAction.runBlock({[unowned self] in self.makeWalls();});
let sequence = SKAction.sequence([SKAction.waitForDuration(1.4),spawnWall])
let repeatForever = SKAction.repeatForever(sequence);
self.runAction(repeatForver, withKey:"makeWalls");
}
}
这可以防止触发多个操作。 (在你的情况下,你有多个计时器被解雇,你只停止了最后一个计时器。)
答案 3 :(得分:2)
因为产卵动作很简单,例如。等待+添加墙,你可以修改产卵动作的速度,如下所示:
import SpriteKit
class GameScene: SKScene {
var score = 0 { didSet{changeSpawningSpeed() } }
override func didMoveToView(view: SKView) {
/* Setup your scene here */
let wait = SKAction.waitForDuration(2.0)
let block = SKAction.runBlock({ [unowned self] in self.spawnWalls()})
let sequence = SKAction.sequence([wait, block])
runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")
}
func spawnWalls(){print("Walls spawned")}
func changeSpawningSpeed(){
if score == 2 {
if let action = actionForKey("spawning"){action.speed += 1.0}
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
score += 1
}
}