2016-06-16 6 views
3

Я задаю вопрос, на который не ответил очень хорошо (и, как результат, заставил меня опубликовать этот вопрос).Итерация через переменные объекта

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

var objectClass:* = getDefinitionByName(getQualifiedClassName(saveItem)); 

try {(getClassByAlias(getQualifiedClassName(saveItem)));} 
catch (err:Error) {registerClassAlias(getQualifiedClassName(saveItem), objectClass);} 

Так что это делает его проверяет, является ли класс объекта в настоящее время зарегистрирован, и регистрирует его, если это не так. К сожалению, у меня есть много классов, которые содержат переменные других пользовательских классов, а также должны регистрировать эти классы. Я не хотел вручную регистрировать каждый отдельный класс, поэтому то, что я пытаюсь сделать, это перебрать все переменные текущего объекта, и если класс переменной не зарегистрирован, он регистрирует его, а затем выполняет итерацию через переменные переменных продолжает регистрироваться и так далее, пока не будут зарегистрированы все незарегистрированные классы. Это позволит мне сохранить буквально все, что я хочу, потому что он зарегистрирует все переменные, которые не зарегистрированы на лету, и сделает вещи чрезвычайно удобными для меня.

По-видимому, единственный способ увидеть переменные объекта во время выполнения - использовать функцию describeType. Это возвращает экземпляр XML, и вы можете получить доступ к переменным, используя ..variable (это XMLList). Здесь я застреваю. Мне нужен способ конвертировать этот XML-код обратно в переменную, чтобы я мог получить доступ к его переменным, чтобы проверить, не зарегистрированы ли какие-либо из них. Вот пример кода XML, который ссылается на пользовательский класс переменного этого пользовательского класса я в настоящее время перебор:

<variable name="itemCondition" type="item::ItemCondition"> 
    <metadata name="__go_to_definition_help"> 
     <arg key="pos" value="882"/> 
    </metadata> 
</variable> 

Мне нужна способ, чтобы преобразовать это в исходный ItemCondition, так что я могу пройти его переменные и продолжить регистрацию. Это более или менее разбивка кода мне нужно (и то, что я до сих пор):

private static function registerVariables(saveItem:*):void { 
    var objectClass:* = getDefinitionByName(getQualifiedClassName(saveItem)); 

    try {(getClassByAlias(getQualifiedClassName(saveItem)));} 
    catch (err:Error) {registerClassAlias(getQualifiedClassName(saveItem), objectClass);} 

    for each (var variable:XML in describeType(saveItem)..variable) { 
     var currentVariable:* = SaveAndLoad.xmlToObject(variable); 
     var currentClass:* = getDefinitionByName(getQualifiedClassName(currentVariable)); 

     try {(getClassByAlias(getQualifiedClassName(currentVariable)));} 
     catch (err:Error) { 
      registerClassAlias(getQualifiedClassName(currentVariable), currentClass); 
      SaveAndLoad.registerVariables(currentVariable); 
     } 
    } 
} 

private static function xmlToObject(variable:XML):* { 
    //Code here that gives me the reference to the current variable 
} 

Любая помощь будет принята с благодарностью. Мой брат работает с Java/C++ и сделал что-то очень похожее на это, я надеялся, что во Flash появился способ.

+2

На самом деле, я бы предпочел написать один перечислитель классов вашего проекта, зарегистрировать их где-нибудь в 'Main.init()' и пропустить все это. Вы все равно должны были бы реализовать 'readExternal()' и 'writeExternal()' во всех них, которые не состоят только из общедоступных переменных. – Vesper

+0

Спасибо за предложение! Через некоторое время решение (по крайней мере, для моей проблемы) поразило меня и на самом деле действительно было очень просто. Чтобы получить доступ к переменной, которая не была зарегистрирована, мне нужно было только «var currentVariable: * = saveItem [variable. @ Name];», и оттуда я на этот раз просто вызвал «registerVariables», используя 'currentVariable' как' saveItem' – ugotopia123

+1

Не оставляйте ответы в комментариях. Если вы сами решили свою проблему, отправьте ответ на свой вопрос. Не оставляйте этот вопрос без приглашения. – null

ответ

1

Я понял проблему, и это было удивительно просто. Мне удалось получить доступ к переменным элемента с помощью []. Я взял имя переменной из XMLList с [email protected] и возвращает строку с именем текущей переменной. Оттуда все, что мне нужно было сделать, было положить currentVariable:* = saveItem[[email protected]];, и это сработало.

Смежные вопросы