2016-06-16 3 views
3

私は非常にうまく答えられていない質問をしています(結果として私はこの質問を投稿しました)。アイテム変数を反復する

私は作っているゲームにオブジェクトを動的に保存しようとしています(私はすでに保存機能を持っています、それはちょっとしたもので、より効率的にしたいです)。この動的保存には、保存しているオブジェクトのすべての変数が現在getClassByAlias関数を使用して登録されているかどうかがチェックされます。ここでは、コードの最初の部分は次のようになります。

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

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

だから何これが行うことは、オブジェクトのクラスが現在登録されている場合、それは確認しており、それがない場合は、それを登録します。残念ながら私は他のカスタムクラスの変数を含む多くのクラスを持っており、それらのクラスも登録する必要があります。私は手動ですべてのクラスを登録したくないので、現在実行中のオブジェクトのすべての変数を反復処理し、その変数のクラスが登録されていない場合はそれを登録し、それらの変数を繰り返し処理します。登録されていないすべてのクラスが登録されるまで続きます。これは、それが即座に登録されていないすべての変数を登録し、私にとっては非常に容易になるため、私が望むものをそのまま保存することができます。

実行時にオブジェクトの変数を表示する唯一の方法は、describeType関数を使用することです。これによりXMLインスタンスが返され、..variable(これはXMLList)を使用して変数にアクセスできます。これは私が立ち往生する場所です。このXMLコードを変数に変換する方法が必要です。変数にアクセスして、それらの変数が登録されていないかどうかを調べることができます。私はその通過することができるように、元のItemConditionにこのバックを変換する方法が必要

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

を:ここでは、このカスタムクラスのカスタムクラス変数を参照するXMLコードの例は、私が現在を反復処理しています変数を登録し続ける。これは私が必要なコード(と、私がこれまで持っている)の多かれ少なかれ内訳です:

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()'のどこかに登録し、すべてをスキップします。とにかく、public変数のみで構成されているのではなく、 'readExternal()'と 'writeExternal()'を実装する必要があります。 – Vesper

+0

提案をありがとう!しばらくして(少なくとも私の問題では)解決策が私に当たって、実際は本当に簡単でした。登録されていない変数にアクセスするには、 'var currentVariable:* = saveItem [variable。@ name];'を実行し、 'currentVariable'を' registerVariable'として 'registerVariables'を呼び出して、 saveItem' – ugotopia123

+1

コメントに回答を投稿しないでください。あなた自身で問題を解決した場合は、自分の質問に対する回答を投稿してください。この質問を、受け入れられた回答なしでぶら下げてはいけません。 – null

答えて

1

私は問題を見つけ出し、それは驚くほど簡単でした。 []を使用してアイテムの変数にアクセスできました。 XMLListの変数名を[email protected]で取得し、現在の変数名のStringを返します。そこから、私がしなければならなかったのは、currentVariable:* = saveItem[[email protected]];と書かれていました。

関連する問題