2015-01-29 4 views
0

Привет всем, в основном, то, что я пытаюсь выполнить, заключается в сохранении числа с Общим объектом, который монеты, которые игрок собирает в игре, и если они уйдут из игры и вернутся, чтобы снова сыграть количество монет он, когда он ушел, все равно покажет, и он сможет добавить к этой сумме, если игрок заберет больше монет. У меня было это немного, но затем текстовое поле начало показывать «NAN».Сохранить номер с общим объектом и добавить к этому сохраненному номеру.

Вот как я его настроил.

переменная private var nCoins:Number;

В функции конструктора У меня есть:

sharedObjectCoins = SharedObject.getLocal("CoinsData"); 

     nCoins = 0 + sharedObjectCoins.data.tCoins; 

     if (sharedObjectCoins.data.tCoins == null) 
     { 
      sharedObjectCoins.data.tCoins = nCoins; 

     }else 
     { 
       trace("Save data found."); // if we did find data... 
       loadDataTimeAttack(); // ...load the data 
     } 

и в играх Enter.Frame Loop У меня есть функция, которая saveDataCoins установки следующим образом:

private function saveDataCoins():void 
    { 

     if (nCoins > sharedObjectCoins.data.tCoins) 
     { 
      sharedObjectCoins.data.tCoins = nCoins; 
     } 


     coinsGraphic.coinsText.text = " " + sharedObjectCoins.data.tCoins; 
     sharedObjectCoins.flush(); 

    } 

не уверен, нужна ли функция, в которой происходит hitTest между монетами и игроком, но вот оно:

private function checkPlayerHitCoins():void 
    { 

     for (var i:int = 0; i < aCoinsArray.length; i++) 
      { 
       //get current point in i loop 
       var currentCoins:mcCoin = aCoinsArray[i]; 

       //test if player is hitting current point 
       if(player.hitTestObject(currentCoins)) 
       { 

        nCoins += 1; 
        updatecoinsTextScore(); 
        updateCoinsPauseScreen(); 
        //Add points sound effects 
        var coinsSEffect:Sound = new coinsSound(); 
        coinsSEffect.play(); 

        //remove point on stage 
        currentCoins.destroyCoins(); 
        //remove points from array 
        aCoinsArray.splice(i, 1); 
        trace("Hit: " + aCoinsArray.length); 
       } 
      } 
    } 

Пожалуйста, если кто-нибудь может мне помочь, возможно, укажите что-то, что я делаю неправильно. Этот код работал отлично один раз, и когда я закрыл экран и вернулся, чтобы повторить его, текстовое поле отображало NAN, и это, когда я нажимаю на монеты, иногда NAN переключается на число как секунда, а затем возвращается в NAN.

ответ

1

В первый раз (или, вернее, каждый раз, когда он создает новый общий объект), вы будете пытаться добавить undefined в 0, что приведет к ошибке во время выполнения или NaN.

Вам необходимо проверить, существует ли значение, прежде чем пытаться выполнить с ним добавление.

if(sharedObjectCoints.data && sharedObjectCoins.data.tCoins && !isNaN(sharedObjectCoins.data.tCoins)){ 
     nCoins = Number(sharedObjectCoins.data.tCoins); //there's not point in adding 0 
     trace("Save data found."); // if we did find data... 
     loadDataTimeAttack(); // ...load the data 
    }else{ 
     sharedObjectCoins.data.tCoins = nCoins; 
    } 

Кроме того, если вы не вручную установить значение в число вар, он будет начать жизнь как NaN. например, var nCoins:Number будет NaN, пока вы не установите его на что-то.

Это говорит о том, что работать с sharedObject прямо так же очень небрежно, чтобы закодировать вашу программу. Действительно, вы должны просто использовать общий объект для загрузки и сохранения значения, а все между ними использует строго типизированную переменную.

var nCoins:int = 0; 
var tCoins:int = 0; 

sharedObjectCoins = SharedObject.getLocal("CoinsData"); 
if(sharedObjectCoins.data && sharedObjectCoins.data.tCoins && !isNaN(sharedObjectCoins.data.tCoins){ 
    tCoins = int(sharedObjectCoins.data.tCoins); 
}else{ 
    //no shared object, use default value for tCoins 
    tCoins = 0; //or whatever it should start off as. 
} 

Затем написать функцию сохранения

private function saveSharedObject():void { 
    sharedObjectCoins.data.tCoins = tCoins; 
    sharedObjectCoins.flush(); 
} 

Затем замените все другие экземпляры sharedObjectCoins.data.tCoins с варом tCoins

Это, вероятно, лучше не промывать общедоступный объект каждый кадра для выполнения целей.

Кроме того, общие объекты могут или не могут фактически сохраняться в зависимости от предпочтений пользователя, доступного пространства для хранения и т. Д. На них не следует полагаться на критическое сохранение данных.

Вы можете прослушивать проблемы с общим объектом с AsyncErrorEvent.ASYNC_ERROR я считаю (это было некоторое время, так как я работал с AS3 Shared Objects)

+0

Большое спасибо сударь Я даже думать о выполнении этого nCoins = 0 + Number (sharedObjectCoins.data.tCoins); , Благодаря вашей помощи я исправил проблему. Да, в последнее время я делал много неряшливого кодирования. Честно говоря, я действительно новый для общего объекта. Просто читал все, что мог, на форумах и т. Д. Я также принял ваш совет, не пытаясь вступить в свое событие ENTER.FRAME благодаря информации о производительности! – Nathan

+0

Ugh nvm Назад в том же месте, что и в прошлый раз. Это работало нормально, но потом просто перестало работать и теперь снова говорит NAN. Спасибо, хотя я ценю помощь – Nathan

+0

обновить свой вопрос, чтобы показать код, который вы используете сейчас. – BadFeelingAboutThis