Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загрузка массивов и векторов из SharedObjects (http://www.flasher.ru/forum/showthread.php?t=205745)

a7s1h1 19.12.2013 17:06

Загрузка массивов и векторов из SharedObjects
 
Сохранение в игре делаю через
Код AS3:

public static var saved:SharedObject = SharedObject.getLocal('saved')

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

Код AS3:

// сохранение
var v:Vector.<String>=new Vector.<String>(['1','2'])
saved.data.v=v
 
// загрузка
v=saved.data.v

Поставил на загрузку проверку:
Код AS3:

trace(saved.data.v); // выводит '1,2'к
v=saved.data.v
trace(v) // выводит null

Странно - подумал я, тем более, что векторы с числами загружались нормально, а векторы типа Vector.<String> - ни в какую: пишет ошибку 1034 о невозможности преобразования объекта в строку.

Решил заставить воспринимать сохранённое значение как вектор:
Код AS3:

trace(saved.data.v); // выводит '1,2'
v=saved.data.v as Vector.<String>
trace(v) // выводит null

Ошибка 1034 типа Coercion исчезла, но v по-прежнему равнялся null

Тогда я решил не приравнивать значения, а тупо засунуть в вектор значения из сохранённого вектора.
Код AS3:

trace(saved.data.v); // выводит '1,2'
v.push(saved.data.v);
trace(v) // выводит '1,2'

Но проблема осталась, так как вместо
Код AS3:

v[0]='1'
v[1]='2'

всё записалось в нулевую ячейку:
Код AS3:

v[0]='1,2'

Код AS3:

trace(saved.data.v); // выводит '1,2'
v.push(saved.data.v);
trace(v[0]) // выводит '1,2'
trace(v[1]) // выдаёт ошибку о выходе индекса 1 за границы диапазона

И тут у меня опустились руки. В самом деле, не переносить же каждое значение из ячейки в ячейку через цикл! Подскажите, пожалуйста, почему не работает обычное приравнивание, как в случае с векторами int и uint и что с этим можно поделать?
Пробовал плюнуть на векторы возвращаться к массивам - проблема та же.

Akopalipsis 19.12.2013 17:22

Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
Код AS3:

var v:Vector.<String>=new Vector.<String>(['1','2'])

Попробуйте вот так -
Код AS3:

var v:Vector.<String>=new <String>['1','2']


a7s1h1 19.12.2013 17:33

Цитата:

Сообщение от Akopalipsis (Сообщение 1155465)
Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
Код AS3:

var v:Vector.<String>=new Vector.<String>(['1','2'])


На объявление массива не обращайте внимания - написал наспех. Давайте просто считать, что на момент сохранения уже имеется вектор с двумя элементами ['1','2']. И вот он почему-то не загружается:
Код AS3:

// сохранение
trace('Saving.  saved.data.v='+saved.data.v) // пишет Saving.  saved.data.v=undefined
trace('Saving.  v='+v);// пишет Saving.  v=1,2
saved.data.v = v;
trace('Saved.  saved.data.v='+saved.data.v)// Saved.  saved.data.v=1,2
// сохранилось нормально. выходим из игры, запускаем заново
 
// загрузка
trace('Loading.  saved.data.v='+saved.data.v) // пишет Loading.  saved.data.v=1,2
trace('Loading.  v='+v);// пишет Loading.  v=
saved.data.v = v;
trace('Loaded.  saved.data.v='+saved.data.v)// пишет Loaded.  v=null


Wolsh 19.12.2013 17:33

Цитата:

var v:Vector.<String>=new Vector.<String>(['1','2'])
Так вектор не создается. Можно использовать конвертацию
Код AS3:

var v:Vector.<String> = Vector.<String>(['1','2']);

Добавлено через 4 минуты
Цитата:

И вот он почему-то не загружается:
В смысле не загружается?
Вот же трейс выдает
Цитата:

trace('Loading. saved.data.v='+saved.data.v) // пишет Loading. saved.data.v=1,2
Далее у Вас v не имеет значения, Вы же не присвоили ей значение из saved.data.v!
Поэтому и null.

a7s1h1 19.12.2013 17:43

Цитата:

Сообщение от Wolsh (Сообщение 1155468)
Так вектор не создается. Можно использовать конвертацию
Код AS3:

var v:Vector.<String> = Vector.<String>(['1','2']);


Wolsh, спасибо огромное! Всё заработало:
Код AS3:

v=Vector.<String>(saved.data.v)

Я с самого начала хотел так сделать, но думал, что это то же самое, что
Код AS3:

v=saved.data.v as Vector.<String>

Это лишний раз доказывает, что надо пробовать все варианты))
Кстати, можете скратце объяснить разницу между 'Class(var)' и 'var as Class'? Я думал, что и то и другое заставляет "обращаться со значением var как с принадлежащим к классу Class"...

Добавлено через 4 минуты
а ещё остаётся открытым вопрос, почему такая фигня только с векторами со значениями String? С int и uint просто приравниваю и всё работает:
Код AS3:

// допустим, v - вектор Vector.<uint>, содержащий 3 элемента: [3,8,5]
trace('saved.data.v='+saved.data.v) // saved.data.v=3,8,5
trace('v='+v) // v=
v=saved.data.v;
trace('v='+v) // v=3,8,5
trace('v[0]='+v[0]) // v[0]=3
trace('v[1]='+v[2]) // v[1]=8
trace('v[2]='+v[2]) // v[2]=5


Wolsh 19.12.2013 18:33

Я не вижу проблемы, Вы показали только то, что работает КАК ДОЛЖНО работать.
Если тот же код не работает со стрингами, то возможно проблема в том, что ваш saved.data.v это массив, а не типизированный вектор, и при преобразовании нетипизированных значений массива в типизированный вектор происходит какой-то облом.
Разница между кастингом as и конвертацией Type() в том, что кастинг не выбрасывает ошибку, а просто возвращает нулл.


Часовой пояс GMT +4, время: 17:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.