【问题标题】:How to encode a player entity using NSCoding - Swift如何使用 NSCoding 对玩家实体进行编码 - Swift
【发布时间】:2016-03-14 16:22:47
【问题描述】:

我想通过保存玩家当前状态来保存我的游戏进度,例如他在地图上的位置、HP、法力、当前状态等。

我需要有关如何将播放器对象转换为 NSdata 并将其存储在 NSUserDefaults 中的帮助。

我有以下播放器属性,但如何使用 NSCoding 对它们进行编码?我必须对每个属性进行编码吗?以及如何对组件进行编码?

var spriteComponent: SpriteComponent!
var animationComponent: AnimationComponent!
var playerMoveComponent: PlayerMoveComponent!
var healthComponent: HealthComponent!
var playerAttackComponent: PlayerMeleeAttackComponent!
var roundHouseSwingComponent: RoundHouseSwingComponent!
var playerMagicAttackComponent: PlayerMagicAttackComponent!

var attackBodyNode: SKNode!
var dashDistance = GameSettings.playerDashDistance
var agent: GKAgent!
var health: Int!
var fullHealth: Int!
var mana: Int!
var fullMana: Int!
var action: Int!
var fullAction: Int!
var hasGateKey: Bool!
var numberOfPotionCarried: Int!
var playerState: PlayerState!
var movementEnabled: Bool!
var dashAttackActivated: Bool!

提前感谢您的帮助。

【问题讨论】:

    标签: sprite-kit nscoding


    【解决方案1】:

    如果组件或实体符合 NSCoding(例如 SKNode 及其子类),则不必对它们进行编码。请改用 KeyArchiver。

    这是一个示例代码,展示了如何保存和加载数据。

    let fileManager = FileManager.default
    guard let documentsURL = fileManager.urls(
        for: FileManager.SearchPathDirectory.documentDirectory,
        in:FileManager.SearchPathDomainMask.userDomainMask).last else {
    
            fatalError("Failed to find the documents folder!")
    }
    
    let savedGameURL = documentsURL
        .appendingPathComponent("SavedGame.plist")
    
    do {
        try data.write(to: savedGameURL)
    } catch let error {
        print("Error writing: \(error)")
    }
    
    var loadedData : Data?
    
    do {
        loadedData = try Data(contentsOf: savedGameURL)
    } catch let error {
        print("Error reading: \(error)")
    }
    

    如果有自定义类,可以把它做成NSObject的子类,并符合NSCoding。您需要实现方法:init?(coder: NSCoder) 和 func encode(with: NSCoder)。请参见 https://developer.apple.com/documentation/foundation/nscoding 了解更多信息。

    希望它会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2014-07-25
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多