Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.12.2013, 17:06
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 1  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
По умолчанию Загрузка массивов и векторов из 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 и что с этим можно поделать?
Пробовал плюнуть на векторы возвращаться к массивам - проблема та же.

Старый 19.12.2013, 17:22
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned

Регистрация: Mar 2013
Сообщений: 1,864
Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
Код AS3:
var v:Vector.<String>=new Vector.<String>(['1','2'])
Попробуйте вот так -
Код AS3:
var v:Vector.<String>=new <String>['1','2']

Старый 19.12.2013, 17:33
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 3  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Не смогу обьяснить литературным языком, но вот в этой строчке, Вы помещаете в массив массив.
Код 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

Старый 19.12.2013, 17:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
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.
__________________
Reality.getBounds(this);

Старый 19.12.2013, 17:43
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 5  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Так вектор не создается. Можно использовать конвертацию
Код 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

Старый 19.12.2013, 18:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я не вижу проблемы, Вы показали только то, что работает КАК ДОЛЖНО работать.
Если тот же код не работает со стрингами, то возможно проблема в том, что ваш saved.data.v это массив, а не типизированный вектор, и при преобразовании нетипизированных значений массива в типизированный вектор происходит какой-то облом.
Разница между кастингом as и конвертацией Type() в том, что кастинг не выбрасывает ошибку, а просто возвращает нулл.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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