Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift呼叫功能多次内部更新_Swift_Function_Sprite Kit - Fatal编程技术网

swift呼叫功能多次内部更新

swift呼叫功能多次内部更新,swift,function,sprite-kit,Swift,Function,Sprite Kit,我通过SpriteKit创建了一个游戏。在游戏中,每隔几秒钟就会有一个球出现在屏幕上(通过函数),玩家必须将其炸掉。现在,我想通过他的分数来检查玩家的级别,因此如果分数大于10,则生成球功能将执行两次(因此屏幕上将生成2个球),以此类推。我试图通过更新乐趣(这将“读取”玩家分数,并根据分数调用spawnBall函数)来访问它。不幸的是,当我这样做的时候,屏幕在几秒钟内就产生了一百万(大约)个球(正如我说的,我希望它每隔几秒钟调用一次函数,并在分数为X时增加调用)。我真的不知道怎么做。 这是我的密

我通过SpriteKit创建了一个游戏。在游戏中,每隔几秒钟就会有一个球出现在屏幕上(通过函数),玩家必须将其炸掉。现在,我想通过他的分数来检查玩家的级别,因此如果分数大于10,则生成球功能将执行两次(因此屏幕上将生成2个球),以此类推。我试图通过更新乐趣(这将“读取”玩家分数,并根据分数调用spawnBall函数)来访问它。不幸的是,当我这样做的时候,屏幕在几秒钟内就产生了一百万(大约)个球(正如我说的,我希望它每隔几秒钟调用一次函数,并在分数为X时增加调用)。我真的不知道怎么做。 这是我的密码:

override func update(_ currentTime: CFTimeInterval) {

    if (self.score <= 10){
        spawnBalls()
    }

    if (self.score > 10 && self.score <= 20){
        spawnBalls()
        spawnBalls()
    }

    if (self.score > 20){
        spawnBalls()
        spawnBalls()
        spawnBalls()
    }

    if (self.subscore == 3) {
        _ = randomBallColorToBlow()
        self.subscore = 0
    }
}

func spawnBalls() {
    let wait = SKAction.wait(forDuration: 1)
    let action = SKAction.run {
        self.createBall()
    }
    run(SKAction.repeatForever((SKAction.sequence([wait, action]))))
}
覆盖函数更新(\uCurrentTime:CFTimeInterval){
如果(self.score 10和self.score 20){
产卵球()
产卵球()
产卵球()
}
if(self.subcore==3){
_=randomBallColorToBlow()
self.subscore=0
}
}
func spawnbolls(){
let wait=SKAction.wait(持续时间:1)
让action=SKAction.run{
self.createBall()
}
运行(SKAction.repeatForever((SKAction.sequence([wait,action]))
}

如果不使用更新函数,我该怎么做???

在更新函数中调用“繁殖球”,每秒调用它60次。 尝试只检查更新中是否满足升级到更高繁殖率的特定要求,但不要在更新函数中调用

private var upgradedToLevel2 = false
private var upgradedToLevel3 = false

//called somewhere probably in a start game func
spawnBalls(duration: 1.0)

override func update(_ currentTime: CFTimeInterval) {

    if (self.score > 10 && self.score <= 20) && !upgradedToLevel2 {
        //this prevents the if loop from running more than once
        upgradedToLevel2 = true 
        self.removeAction(forKey: "spawn")
        spawnBalls(duration: 0.5)
    }

    if (self.score > 20) && !upgradedToLevel3 {
        //this prevents the if loop from running more than once
        upgradedToLevel3 = true
        spawnBalls(duration: 0.33)
    }
}

func spawnBalls(duration: Double) {

    let wait = SKAction.wait(forDuration: duration)
    let action = SKAction.run { self.createBall() }
    let repeater = SKAction.repeatForever(SKAction.sequence([wait, action]))

    run(repeater, withKey: "spawn")
}
private var upgradedToLevel2=false
私有变量upgradedToLevel3=false
//打电话给某个地方可能是在开始游戏时
产卵球(持续时间:1.0)
覆盖函数更新(currentTime:CFTimeInterval){
如果(self.score>10和&self.score 20)和升级到3级{
//这可以防止if循环运行多次
upgradedToLevel3=真
产卵球(持续时间:0.33)
}
}
func繁殖球(持续时间:双倍){
let wait=SKAction.wait(持续时间:duration)
让action=SKAction.run{self.createBall()}
让repeater=SKAction.repeatForever(SKAction.sequence([wait,action]))
运行(中继器,按键:“繁殖”)
}

如上所述,您多次产卵,需要将其分解。我建议使用Int而不是bool来跟踪level,以便能够处理“无限”数量的level-up,而不需要生成“无限”数量的布尔变量

private var nextLevel = 0 //Level 0 allows us to spawn a ball on startup, so no need to call spawnBalls anywhere else

override func update(_ currentTime: CFTimeInterval) {

    if (self.score > 10 * nextLevel){
        self.removeAction(forKey: "spawn") //this prevents the if loop from running more than once
        nextLevel += 1
        spawnBalls(count:nextLevel,forDuration:1) //You can change the 1 here if you want to spawn balls at a faster speed,  I would recommend a variable that uses nextLevel in a forumula
    }
}

func spawnBalls(count:Int, forDuration duration:TimeInterval) {
    let range = 0..<count
    let wait = SKAction.wait(forDuration: duration)
    let action = SKAction.run {range.forEach{self.createBall()}}
    let repeater = SKAction.repeatForever(SKAction.sequence([wait, action]))
    removeAction(forKey:"spawn")
    run(repeater, withKey: "spawn")
}
private var nextLevel=0//0级允许我们在启动时生成一个球,因此无需在其他任何地方调用spawnball
覆盖函数更新(currentTime:CFTimeInterval){
如果(自我评分>10*nextLevel){
self.removeAction(forKey:“spawn”)//这会防止if循环多次运行
下一级+=1
繁殖球(count:nextLevel,forDuration:1)//如果希望以更快的速度繁殖球,可以在此处更改1,我建议使用forumula中使用nextLevel的变量
}
}
func生成球(计数:整数,持续时间:时间间隔){

让范围=0。你不需要在你的问题中粘贴不相关的代码,这会使代码变得不必要的长,更难遵循谢谢!这是有效的,你能解释一下为什么你将升级变量设置为私有的吗?这从技术上改变了你游戏的预期行为。你不再立即生成2个,而是在一个较小的持续时间内生成2个tion,记住这一点,否则答案会让你到达你需要去的地方。你完全正确,我没有考虑到这一点。我想应该由OP来决定他是否只是想加快这个过程,或者在比赛中展示球clumps@omerc它将变量保留在类的作用域中。如果您知道该变量永远不会被访问ed或不应在类的作用域之外访问,然后将其设置为private。private将防止意外访问和操纵属性,从而产生不希望的效果。老实说,如果您是唯一的开发人员,您意外访问自己的另一个类变量的机会很小,但使用ge并不是一个坏习惯将它们设置为私有,以防有一天您可能会开始与其他人一起编码。