Ios Swift变量不保存值或以某种方式重置自身

Ios Swift变量不保存值或以某种方式重置自身,ios,swift,Ios,Swift,我试图在一场比赛中保持分数,这场比赛有着与不同事物相关的不同分值。用户必须触摸游戏中的东西才能获得分数。然而,分数的计算并不准确 我已经确定,游戏中每个元素的相关分数都正确地存储在名为ballValue的变量中。变量currentScore用于保存分数,然后我使用SKLabelNode来显示currentScore的值 currentScore使用值0初始化,并在用户触球时使用其当前值加上ballValue进行更新 更新以显示代码和上下文 class ChallengeScene: SKScen

我试图在一场比赛中保持分数,这场比赛有着与不同事物相关的不同分值。用户必须触摸游戏中的东西才能获得分数。然而,分数的计算并不准确

我已经确定,游戏中每个元素的相关分数都正确地存储在名为
ballValue
的变量中。变量
currentScore
用于保存分数,然后我使用
SKLabelNode
来显示
currentScore
的值

currentScore
使用值0初始化,并在用户触球时使用其当前值加上
ballValue
进行更新

更新以显示代码和上下文

class ChallengeScene: SKScene, GKGameCenterControllerDelegate {

    // MARK: Ball Data
    var randomBallType : Int = 0
    var ballValue : Int = 0

    // MARK: HUD
    var scoreLabel = SKLabelNode(fontNamed: "Impact")
    var timeLabel = SKLabelNode(fontNamed: "Impact")

    var currentScore : Int = 0 {
        didSet {
            self.scoreLabel.text = "\(self.currentScore)"
            GameHandler.sharedInstance.score = currentScore
        }
    }

    // MARK: Initial Setup
    func createHUD() {
    ... UNRELATED HUD STUFF...
        currentScore = 0
    }

    // MARK: Gameplay Setup
    func createBall(forTrack track: Int) {
        setupTracks()

        randomBallType = GKRandomSource.sharedRandom().nextInt(upperBound: 9)

        switch randomBallType {
        case 0:
            player = SKSpriteNode(imageNamed: "blueOne")
            ballSpeed = 0.008
            ballValue = 1
        case 1:
            player = SKSpriteNode(imageNamed: "minusThree")
            ballSpeed = 0.008
            ballValue = -3
        case 2:
            player = SKSpriteNode(imageNamed: "minusFive")
            ballSpeed = 0.008
            ballValue = -5
        case 3:
            player = SKSpriteNode(imageNamed: "purpleThree")
            ballSpeed = 0.008
            ballValue = 3
        case 4:
            player = SKSpriteNode(imageNamed: "greenFive")
            ballSpeed = 0.008
            ballValue = 5
        case 5:
            player = SKSpriteNode(imageNamed: "blackTen")
            ballSpeed = 0.008
            ballValue = 10
        default:
            player = SKSpriteNode(imageNamed: "blueOne")
            ballSpeed = 0.008
            ballValue = 1
        }

        player?.name = "BALL"
        player?.size = CGSize(width: 100, height: 100)
        player?.physicsBody?.linearDamping = 0

        ...UNRELATED BALL STUFF...

        self.addChild(player!)
    }

    // MARK: Overrides
    override func didMove(to view: SKView) {

        createHUD()
        launchGameTimer()

        self.run(SKAction.repeatForever(SKAction.sequence([SKAction.run {
            self.createBall(forTrack: self.track)
            }, SKAction.wait(forDuration: 1)])))

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            let node = self.nodes(at: location).first

            if node?.name == "BALL" {
                currentScore = currentScore + ballValue
                node?.removeFromParent()
            }
        }

    }


    override func update(_ currentTime: TimeInterval) {

        // GAME TIMER RELATED STUFF

    }
}
class ChallengeScene:SKScene,GKGameCenterControllerDelegate{
//马克:球数据
变量类型:Int=0
var ballValue:Int=0
//马克:抬头显示器
var scoreLabel=SKLabelNode(名称为“影响”)
var timeLabel=SKLabelNode(名称为“影响”)
变量currentScore:Int=0{
迪塞特{
self.scoreLabel.text=“\(self.currentScore)”
GameHandler.sharedInstance.score=currentScore
}
}
//标记:初始设置
func createHUD(){
…与HUD无关的东西。。。
currentScore=0
}
//马克:游戏设置
func createBall(forTrack轨迹:Int){
设置轨道()
randomBallType=GKRandomSource.SharedAndom().nextInt(上限:9)
开关球型{
案例0:
player=SKSpriteNode(图像名为:“蓝色一号”)
球速=0.008
球值=1
案例1:
player=SKSpriteNode(图像名为:“minusThree”)
球速=0.008
球值=-3
案例2:
player=SKSpriteNode(图像名为:“minusFive”)
球速=0.008
球值=-5
案例3:
player=SKSpriteNode(图像名为“purpleThree”)
球速=0.008
球值=3
案例4:
player=SKSpriteNode(图像名为:“绿色五号”)
球速=0.008
球值=5
案例5:
player=SKSpriteNode(图像名为:“blackTen”)
球速=0.008
球值=10
违约:
player=SKSpriteNode(图像名为:“蓝色一号”)
球速=0.008
球值=1
}
球员?.name=“球”
播放器?.size=CGSize(宽:100,高:100)
播放器?.physicsBody?.linearDamping=0
…无关的球的东西。。。
self.addChild(玩家!)
}
//标记:覆盖
覆盖func didMove(到视图:SKView){
createHUD()
launchGameTimer()
self.run(SKAction.repeatForever)(SKAction.sequence([SKAction.run{
self.createBall(forTrack:self.track)
},SKAction.wait(持续时间:1)])
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
让node=self.nodes(在:位置)。首先
如果节点?.name==“球”{
currentScore=currentScore+球值
节点?.removeFromParent()
}
}
}
覆盖函数更新(uCurrentTime:TimeInterval){
//游戏计时器相关的东西
}
}

我想我知道问题发生在哪里(在触摸覆盖中),我只是不明白为什么会发生。如果你能帮上忙,那就太棒了

你有一个
ballValue
属性。每次生成一个新球时,您都会为新创建的球设置适当的
ballValue
。其他现有的球呢?触摸其中任何一个都会得到同样的
ballValue

触球时,您需要知道触球的正确值,该值可能与最近创建的球的值不同。您可能想做的是创建一个子类
SKSpriteNode
,它代表一个球,并保存它自己的值:

class BallNode: SKSpriteNode {
    let value: Int

    init(imageName: String, speed: CGFloat, value: Int) {
        let texture = SKTexture(imageNamed: imageName)
        self.value = value
        super.init(texture: texture, color: .init(white: 1, alpha: 0), size: texture.size())
        self.speed = speed
    }

    required init(coder decoder: NSCoder) { fatalError() }
}
像这样创建球:

func createBall(forTrack track: Int) {
//设置轨道()

然后,要处理触球,请使用触球的值更新得分:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if let ball = self.nodes(at: location).flatMap({ $0 as? BallNode }).first {
            currentScore += ball.value
            ball.removeFromParent()
        }
    }
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果let ball=self.nodes(at:location).flatMap({$0 as?BallNode}).first{
currentScore+=ball.value
ball.removeFromParent()
}
}
}

逻辑似乎不正确。。每次实例化一个
,球的
值就会改变。。换句话说,这看起来像一个全局属性,而不是类级属性(每个球都应该有一个球值),而不是所有球之间共享的单个实例。。因此,当您执行
currentScore=currentScore+ballValue
时,它实际上执行了
currentScore
+实例化的最后一个球的值。。至少这是您共享的代码量的结论。@Brandon如果它不是一个全局属性,我如何在每次触摸时将
ballValue
添加到
currentScore
?我有
var-ballValue:Int=0
类ChallengeScene:SKScene,GKGameCenterControllerDelegate中{
如果那是你想要的mean@Brandon我更新了这篇文章以显示更多的上下文“但是分数没有被准确计算”。这意味着什么?你得到了什么分数,你期望得到什么分数,为什么?“我想我知道问题发生在哪里”是的,但你甚至还没有告诉我们问题是什么。你是否尝试过设置断点,然后通过触摸开始查看到底发生了什么?你有一个很棒的调试
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if let ball = self.nodes(at: location).flatMap({ $0 as? BallNode }).first {
            currentScore += ball.value
            ball.removeFromParent()
        }
    }
}