2014-02-01 2 views
1

Я создал игру на основе HTML5 + JS, используя melonJS для Windows8.Как сохранить на диск в формате JSON в приложении Windows Store (используя WinJS)?

Но как сохранить сохраненные игровые данные игрока в файле диска (желательно 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

Наиболее очевидный вопрос, кажется, что вы не вызывая функцию 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. Таким образом, ваш код вызова может полагаться на callbacksPromise, чтобы быть уверенным, что файл успешно сохранен в хранилище.
  2. У вас были дополнительные переменные (неиспользуемые), а done для создания файла устанавливала переменную, которая не существовала локально (возможно, это где-то еще в вашем коде).
+1

Почему вы не просто возвращаете обещание от createFileAsync и остальной части цепочки и выполняете его с помощью символа saveDone? Просто измените последний .done на. Then. Таким образом, вам не нужен новый WinJS.Promise, который вы не выполняете с каким-либо значимым значением, и исключите файл dataSaved.savingDone, который выходит из сферы действия после того, как все это завершится. –

+0

Благодарю вас за ответ. я вызываю «meSave» с помощью нажатия кнопки, а флаг «saveDone» - для кнопки сохранения, чтобы отобразить диалоговое окно при завершении сохранения. @Kraig: учитывая ваше предложение, тогда это будет 'return localFolder.createFileAsync (.....). Then (// writeJSON). Then (function() {game.savingDone = true});'? –

+0

@ KraigBrockschmidt-MSFT - видимо, я хотел устроить вечеринку обещаний. Я не пригласил некоторых гостей на ваше замечательное предложение. :) – WiredPrairie