我正在使用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分。我怎么能避免这种情况?
答案 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。