一次一个分数,更新方法

时间:2017-01-11 16:52:28

标签: swift sprite-kit

我正在使用SpriteKit创建一个简单的游戏(主要用于学习),我得到了一个关于分数添加的问题。一些背景:我正在检查精灵(SKShapeNode)是否包含另一个精灵,如果是真的,我会检查它们的颜色,如果它是相同的颜色,则玩家应获得1分。我写了这个函数:

    func onMatch(){
    for ring in mColorRings {
        if(mPlayer.contains(ring.position)){
                if mPlayer.fillColor.isEqual(ring.fillColor) {
                score += 1
                mScoreLbl.text = "\(score)"
            }
        }
    }
}

哪个有效,问题是,我在更新方法中调用了这个函数。由于更新方法运行很多,它会调用我的函数很多时间,只要mPlayer包含ring,它就会为玩家添加1分。我怎么能避免这种情况?

2 个答案:

答案 0 :(得分:1)

这取决于你的游戏机制。如果戒指应该给你一次得分然后消失,你可以安全地将其移除,如果测试。如果你想让戒指保持不变并且以后可以重复使用,你可以在戒指类中添加一个布尔值,称为" scoreGiven"并重做你的if测试到这样的事情:

func onMatch(){
for ring in mColorRings {
    if !ring.scoreGiven{
        if(mPlayer.contains(ring.position)){
            if mPlayer.fillColor.isEqual(ring.fillColor) {
                score += 1
                mScoreLbl.text = "\(score)"
                ring.scoreGiven = true
            }
        }
    }else if(!mPlayer.contains(ring.position)){
        ring.scoreGiven = false
    }
}

这只是一个例子,但请注意更新的if语句中的" not"

答案 1 :(得分:0)

好的,这就是我的建议:

var playerPassed = false

func onMatch(){
    for ring in mColorRings {
        if(mPlayer.contains(ring.position)) {
                if ((mPlayer.fillColor.isEqual(ring.fillColor))  && playerPassed == false) {
                score += 1
                mScoreLbl.text = "\(score)"
                playerPassed = true
            }
        }
    }
}

你正在创建一个bool并检查是否 false (默认),如果是,则执行该块,当它执行时,bool设置为 true 并且条件将是错误的,不再返回true。