2016-06-16 5 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];'이 필요했고'currentVariable'을'registerVariable'을 사용하여'registerVariables'를 다시 호출했습니다. saveItem' – ugotopia123

+1

댓글에 답변을 게시하지 마십시오. 문제를 직접 해결 한 경우 자신의 질문에 대한 답변을 게시하십시오. 이 질문을 답장하지 않고 그대로 두십시오. – null

답변

1

나는 문제를 알아 냈고, 그것은 놀랍도록 쉬웠다. []을 사용하여 항목의 변수에 액세스 할 수있었습니다. XMLList의 변수 이름을 [email protected]으로 잡고 현재 변수 이름의 문자열을 반환합니다. 거기서부터 내가해야만하는 것은 currentVariable:* = saveItem[[email protected]];이라고 입력하면됩니다.