如何跨场景传递价值

时间:2019-01-26 18:49:26

标签: swift xcode

我正在尝试在3个不同的场景上显示“货币”值,并且它显示在GameScene上,而不显示在GameOverScene或ShopScene上。

这是正在运行的GameScene的相关代码:

 func adjustMoney(by points: Int){
    var money = UserDefaults().integer(forKey: "moneyscore")
    money += points
    MoneyLabel.text = "Money = " + UserDefaults().integer(forKey: "moneyscore").description
    UserDefaults().set(money, forKey: "moneyscore")
}

func projectileDidCollideWithMonster(projectile: SKSpriteNode, monster: SKSpriteNode) {
    print("Hit")
    projectile.removeFromParent()
    monster.removeFromParent()
    monstersDestroyed += 1
    adjustScore(by: 1)
    adjustMoney(by: 2)

这是其他场景中的总代码(只有ShopScene,与其他场景中的相同):

import Foundation
import SpriteKit

var welcomeLabel: SKLabelNode!
class ShopScene: SKScene {

var background = SKSpriteNode(imageNamed: "background")

override func didMove(to view: SKView) {
    background.zPosition = -1
    background.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
    addChild(background)       welcomeLabel = SKLabelNode(fontNamed: "Chalkduster")
    welcomeLabel.text = "Welcome to the shop!"
    welcomeLabel.fontSize = 40
    welcomeLabel.fontColor = SKColor.black
    welcomeLabel.position = CGPoint(x: size.width/2, y: size.height/1.2)
    addChild(welcomeLabel)

    MoneyLabel = SKLabelNode(fontNamed: "Chalkduster")
    MoneyLabel.text = "Money = \(money)"
    MoneyLabel.fontSize = 20
    MoneyLabel.fontColor = SKColor.black
    MoneyLabel.position = CGPoint(x: size.width/6.2, y: size.height/1.35)
    addChild(MoneyLabel)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)  {

    let gameScene = GameScene(size: self.size)
    gameScene.scaleMode = .aspectFill

    self.view?.presentScene(gameScene, transition: SKTransition.doorsCloseHorizontal(withDuration: 1.0))
    }
}

但是它只说钱= 0

----我不确定这是否有任何意义,但是在我的“投射物”和“怪物”首先碰撞每场比赛之前,我所有的高分,高分和金钱值均为0,然后他们回到了自己的状态。保存的值,除了得分明显为0。得分是唯一未保存且确实移至GameOverScene的值。

1 个答案:

答案 0 :(得分:-1)

在更新用户默认值(钱)时,您需要访问 UserDefaults()。integer(forKey:“ moneyscore”)才能在GameOverScene或ShopScene类中使用它。

这实际上仅针对您的特定情况。另一方面,如果您有兴趣传递不同类中的数据(如果它们具有视图,则可以在屏幕上提及它们),则可以采用不同的方法。您可以按照link进行参考。