如何在Windows应用商店应用中使用JSON格式文件保存到磁盘(使用WinJS)?

时间:2014-02-01 05:54:13

标签: javascript windows-8 winjs melonjs

我使用melonJS for Windows8创建了一个基于HTML5 + JS的游戏。

但是,如何将玩家持久的游戏数据保存到磁盘文件中(最好是localFolder)。

我已经阅读了MSDN论坛中提供的示例,但没有提及将其保存为JSON格式文件......而且我对Win8应用程序编程有点新鲜。

无论如何,这是我尝试的(当玩家选择保存时调用此功能):

function meSave() {
    //create a var to store the the persisting data during the play
    var dataSaved = {
      data: {
        progress: game.data.progress,            

        HP: game.data.HP,
        MP: game.data.MP,
        Level: game.data.Level,
        maxHP: game.data.maxHP,
        maxMP: game.data.maxMP,
        Money: game.data.Money,

        currPos: {
            x: me.game.getEntityByName('mainPlayer')[0].pos.x,
            y: me.game.getEntityByName('mainPlayer')[0].pos.y,
        },
        currStage: me.levelDirector.getCurrentLevelId(),
      }
    };

    var applicationData = Windows.Storage.ApplicationData.current;
    var localFolder = applicationData.localFolder;
    var filename = "dataFile.json";

    function writeTimestamp() {
        localFolder.createFileAsync("dataFile.json",
           Windows.Storage.CreationCollisionOption.replaceExisting)
             .then(function (file) {               
                 return Windows.Storage.FileIO.writeTextAsync(file,
                           JSON.stringify(dataSaved));
             }).done(function () {
                 game.savingDone = true;
        });
    }   
}

1 个答案:

答案 0 :(得分:1)

最明显的问题似乎是您没有在代码中调用函数writeTimestamp。还有一些你可能会考虑做的其他事情:

meSave()
    .done(function () {
        console.log('saved!');
    });

function meSave() {
    //create a var to store the the persisting data during the play
    var dataSaved = {
        /* put or fetch your game data here */
    };

    var applicationData = Windows.Storage.ApplicationData.current;
    var localFolder = applicationData.localFolder;
    var filename = "dataFile.json";

    return localFolder.createFileAsync(filename,
            Windows.Storage.CreationCollisionOption.replaceExisting)
        .then(function (file) {
                 return Windows.Storage.FileIO.writeTextAsync(file,
                            JSON.stringify(dataSaved));
        }).then(function() {
            // dataSaved.done ... although this would be lost if dataSaved is local
        });
}

我改变了一些事情:

  1. meSave函数内部不需要内部命名函数。我用另一个Promise替换了这个函数。通过这种方式,您的调用代码可以依赖callbacks的{​​{1}}来了解该文件已成功保存到存储。
  2. 你有额外的变量(未使用),文件创建的Promise设置了一个本地不存在的变量(可能是你代码中的其他地方)。