0

私は過去数日間、この問題について熟考してきました.動的変数名の使用を中心に展開するような問題を抱えている他の人を見つけることができますが、私がやろうとしていることに対して解決策はまったく機能しません.

私は共有オブジェクト (この目的の名前は sfSaveData) を使用して、ローカル保存ファイルを作成しています。この同じシステムは、いくつかのプロジェクトで非常にうまく使用されていますが、コードは過度に移植可能ではありません。つまり、プロジェクトごとに、保存する各設定/データを組み込むために、クラス ファイルを完全に変更する必要があります。だから私はこの脳波を持っています-ローカル保存ファイルを作成/更新するクラスを手動で変更するのではなく、必要な変更をXMLファイルに入れ、XMLをループして共有オブジェクト内に必要なデータを作成するクラスを作成します.

私の問題は、共有オブジェクトを正しく参照する結果を得ることです。これが私が持っているもので、適切に機能しています:

完全を期すために、これは XML ファイルからの抜粋です。現時点では、これを機能させるために、ファイル内のこの 1 つのエントリのみを使用しています (機能するまでデータを追加しても意味がありません)。

<dataField label = "dataField">
    <dataTitle label = "dataTitle">locationArray</dataTitle>
    <dataType label = "dataType">Array</dataLabel>
    <dataContent label = "dataContent">[true, true, true, true, true]</dataContent>
</dataField>

注: DataPass は、イベントでデータを渡すことができるカスタム イベントです。この例では、XML コンテンツを含む変数を渡します。データは、変数 event.datPass を介してアクセスできます。これは正しく転送されています。

これはクラス ファイル (SaveDataHandler) 内にあり、共有オブジェクトを含むファイルは InGameSettings です。SaveDataHandler はインスタンスとして作成されます。InGameSettings は、Public Static Vars (sfSaveData:SharedObject を含む) で満たされた Public Class です。フォルダ構造は /data/SaveDataHandler と /setting/InGameSettings です。

function processSaveXML(event:DataPass):void {
    var outputString;
    for each (var dataField.XML in event.datPass) {
        outputString = (InGameSettings.sfSaveData.data." + dataField.dataTitle);
        /*
        * This is where it all goes wrong ;)
        * To access outputString's content as the variable name, I use "this".
        * I realise that this causes outputString to relate to the SaveDataHandler
        * class rather than the InGameSettings class - which is part of the problem
        */
        this[outputString] = dataField.dataContent;
        InGameSettings.sfSaveData.flush();
    } // for each loop
}  // function processSaveXML

変数名の1つを手動で入力すると、たとえば

InGameSettings.sfSaveData.LocationArray = dataField.dataContent

それ以外の

this[outputString] = dataField.dataContent

それは正常に動作します。私の問題は、 outputString の内容を別のクラスの変数の識別子として使用する方法がわからないことです。私が得るのはエラーメッセージです:

ReferenceError: エラー #1056: プロパティ InGameSettings.sfSaveData.data.locationArray を data.SaveDataHandler に作成できません。

それで、あなたが私を正しい方向に向けることができれば、私は最も感謝しています. 今週はこのせいでかなりの髪の毛を失いましたが、このすべてが SaveDataHandler クラスにハードコードされている私のコードの厄介なハックを整理するために、これを機能させたいと思っています。

4

1 に答える 1

0
function processSaveXML(event:DataPass):void {
var outputString;
for each (var dataField.XML in event.datPass) {
    outputString = dataField.dataTitle;

    InGameSettings.sfSaveData.data[outputString] = dataField.dataContent;
    // the trick is here. You need to refer "data" of the SO, and then add
    // what's in brackets to make a dynamic property.
    InGameSettings.sfSaveData.flush();
} // for each loop
}  // function processSaveXML
于 2013-04-18T16:40:40.207 に答える