Можно ли не сбрасывать общий объект при закрытии?

У меня проблема с методом сброса sharedObject. Можно ли не сбрасывать новые данные при закрытии swf? Моя функция сохранения — единственная функция, которая вызывает метод сброса, а также определяет, какой массив и где находится в данных sharedObject.

parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade;
parentMC.sharedObject.flush();

Однако, когда я изменяю массив tempMoveSpdUpgrade, он также сохраняет новые данные в sharedObject, даже если сброс еще не был вызван.

tempMoveSpdUpgrade[0][2] = 1;
trace(parentMC.sharedObject.data.moveSpdUpgrade);

Эта трассировка показывает, что данные изменились, но я не понимаю, так как флеш не вызывался и swf не закрывался. Мне интересно, почему изменения, внесенные в массив, автоматически изменяют данные sharedObject.

Спасибо вам за помощь.

Редактировать:

public function saveGame(){  
    parentMC.sharedObject.data.money = parentMC.money;  
    parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade;  
    parentMC.sharedObject.flush();  
}

Как я уже говорил в комментариях к hackattack, деньги являются правильными данными, когда я не сохраняю, но массив moveSpdUpgrade изменяется в любом случае.


person oliboon    schedule 23.07.2012    source источник


Ответы (2)


Я думаю, что вы сталкиваетесь с немного запутанной вещью о массивах. То, что происходит, никогда не сохраняет какие-либо данные другой функцией или имеет какое-то отношение к остальной части вашего кода.

Простой метод, когда вы пытаетесь скопировать массив этого общего объекта, не создает два отдельных объекта. Вместо этого вы всегда работаете с массивом общих объектов в режиме реального времени.

package
{
  import flash.display.Sprite;

  public class arraytester extends Sprite
  {

    private var a:Array = new Array(1,2,3,4,5);
    private var b:Array = new Array("a","b","c","d","e","f");

    public function arraytester()
    {

    // Both arrays are different Objects
        trace(a); // 1,2,3,4,5
        trace (b); //a,b,c,d,e,f

    // Both arrays are pointing to the same Object
        a= b;
        trace(a); //a,b,c,d,e,f
        trace (b); //a,b,c,d,e,f

        b[1] = 2;
        trace(a); //a,2,c,d,e,f
        trace (b); //a,2,c,d,e,f

    // a is a copy of b while becoming a seperate Object
        a = b.concat();
        b[0]= 1;
        trace(a); //a,2,c,d,e,f
        trace (b); //1,2,c,d,e,f
    }
  }
}
person Sidrich2009    schedule 24.07.2012
comment
Я попытался создать новый массив moveSpdUpgrade и вместо этого использовать его для сохранения. moveSpdUpgrade = tempMoveSpdUpgrade.concat(); tempMoveSpdUpgrade[0][0] = 0; trace(moveSpdUpgrade); trace(tempMoveSpdUpgrade); Однако две трассировки показывают одно и то же, даже если они были изменены после объединения. - person oliboon; 25.07.2012
comment
Я понял, что ваш пример был с одномерным массивом. Я изменил его, чтобы он соответствовал моему коду, и теперь он работает. Большое вам спасибо. Мне, очевидно, нужно было обновить массивы. - person oliboon; 25.07.2012

То, что находится в общем объекте, загружаемом в память, и то, что сохраняется на диск, — это разные вещи. Вы отслеживаете общий объект в памяти. Пока вы не сбросите этот общий объект, он, вероятно, не сохранит свой образ на диск. Попробуйте создать новый SharedObject и отследить его, он должен быть другим.

Изменить:

Я вижу ошибку в том, что я сказал вам сделать раньше (ниже в комментариях). Я сказал вам создать новый экземпляр moveSpdUpgrade для размещения в вашем общем объекте с помощью метода .concat. Причина, по которой это не работает, заключается в том, что moveSpdUpgrade представляет собой двумерный массив, и я пропустил эту деталь. Таким образом, вызов .concat создает новый экземпляр, но новый экземпляр по-прежнему заполнен ссылками на массивы и те массивы, которые вы редактируете. Поэтому, чтобы решить эту проблему, нам нужно сделать глубокую копию moveSpdUpgrade. Вот функция, которая выполнит это

function array2DConcat(target : Array) : Array {
    var buff : Array = new Array(target.length);
    for(var i : int = 0;i < target.length;i++) }
        buff[i] = target[i].concat();
    }
    return buff;
}

а затем, если вы измените свой метод на

public function saveGame(){  
    parentMC.sharedObject.data.money = parentMC.money;  
    parentMC.sharedObject.data.moveSpdUpgrade = array2DConcat(parentMC.upgrades.tempMoveSpdUpgrade);  
    parentMC.sharedObject.flush();  
}

надеюсь, это сработает.

person hackattack    schedule 23.07.2012
comment
В настоящее время, даже если я не использую кнопку сохранения, которая вызывает метод flush(), данные в этом массиве загружаются со всеми последними изменениями, а не с последней сохраненной версией. - person oliboon; 24.07.2012
comment
похоже, что если вы не вызываете flush напрямую, Flash Player записывает общий объект в файл после завершения сеанса общего объекта. Я бы сделал новый экземпляр массива tempMoveSpdUpgrade, чтобы поместить его в ваш общий объект, чтобы вы могли изменять tempMoveSpdUpgrade, не затрагивая общий объект. вот так: parentMC.sharedObject.data.moveSpdUpgrade = parentMC.upgrades.tempMoveSpdUpgrade.conact() - person hackattack; 24.07.2012
comment
Что странно, так это то, что я пытаюсь, даже не закрывая swf. Я просто возвращаюсь в главное меню и загружаю сохраненную игру. Я попробовал ваш метод, и он все еще, кажется, изменяет общий объект при изменении массива. - person oliboon; 24.07.2012
comment
это странно. Если вы разместите больше кода, я могу попытаться помочь вам в дальнейшем, но с предоставленной информацией это лучшее, что я могу сделать. удачи. - person hackattack; 24.07.2012
comment
Я нашел еще кое-что странное, я также сохраняю деньги игрока, когда вызываю функцию сохранения игры. Эта переменная покажет правильную сумму, даже если она будет сохранена с использованием того же метода и той же функции, что и массив moveSpdUpgrade. По какой-то причине переменная money не сохраняется, когда не вызывается функция saveGame, а массив. - person oliboon; 24.07.2012
comment
Я только что отредактировал свою функцию. Как вы можете видеть, это действительно просто, но деньги работают (сохраняются только тогда, когда я вызываю функцию сохранения игры), а массив - нет. - person oliboon; 24.07.2012
comment
Я внес изменения в свой код, но теперь получаю сообщение об ошибке для moveSpdUpgrade[0][2] о том, что оно не определено. Есть ли какие-либо изменения, которые необходимо внести в загружаемую игру? tempMoveSpdUpgrade = parentMC.sharedObject.data.moveSpdUpgrade; - person oliboon; 24.07.2012
comment
Извините, я не уверен. Надеюсь, я навел вас на правильный путь, но, похоже, здесь происходит нечто большее, чем я могу вам помочь. - person hackattack; 24.07.2012
comment
Спасибо вам за помощь. Однако, когда я пытаюсь отследить parentMC.sharedObject.data.moveSpdUpgrade, я получаю только ,, . Кажется, сработала конкатенация, но, похоже, я потерял данные. Я должен уйти прямо сейчас, но я постараюсь исправить это завтра. - person oliboon; 24.07.2012