0

外部の「トピック」swf ファイル (トピックに固有のライブラリ アイテムを含む) をロードする単一の「アプリケーション」swf を利用する教育用ソフトウェアを作成しています。これらの外部「トピック」swf ファイルはそれぞれ、トピックに固有の計算を解決するカスタム クラスも利用します (例: trigonometry.swf トピック ファイルの trigonometry クラス)。

trigonometry.swf の trigonometry クラスが、メインの「アプリケーション」swf に存在するカスタム クラス メソッドを参照できるようにしたいと考えています。コンテキストを知るのに役立つ場合は、三角法に取り組んでいるユーザーが、正しいと信じている三角関数 (sin、cos、または tan) を入力し、それらが正しいかどうかを「チェック」できるようにしてください。「indicate_right_wrong」メソッドは、メインの「アプリケーション」swf の「grader」カスタム クラスに存在します (このクラスに加えた変更は、すべてのトピックで更新されます)。では、外部からロードされた swf ファイルの独自のカスタム クラスから、メインの swf のカスタム クラス メソッドを参照するにはどうすればよいでしょうか。

「grader」カスタム クラスを各「topic」swf にインポートして直接参照すると、結果が機能しますが、「grader」に変更を加えた場合に各トピック swf を再公開する必要はありません。 「カスタムクラス。したがって、メインの「アプリケーション」swf 内に存在する場合、各トピックが「グレーダー」カスタム クラスを参照できるようにしようとしています。

親またはparent.parentのバリ​​エーションを使用しようとすると発生するエラーは、property grader_class not found on flash.display.Stage(親の場合)およびCannot access a property or method of a null object reference.(parent.parentを使用する場合)です。

ご協力いただきありがとうございます。

4

2 に答える 2

1

コンパイル中のコードにないメソッドを呼び出すコードはコンパイルできません。ただし、メソッドを評価することでランタイム呼び出しを行うことができます。例えば:

stage["myfunction"](args);

ただし、 George Profenzaが示したように、何らかのパス ロジックを作成してメソッドを参照することもできますが、ディスパッチされたイベントまたはメソッド呼び出しに関数リスナーを渡すだけのほうが、成功率ははるかに高くなります (そして操作が簡単になります)。

たとえばCHECK_ANSWER、ユーザーが回答を入力したときに発生するカスタム イベントがあるとします。関数 (「 application.swf gradeAnswer()」に存在する) は、子の「trigonometry.swf」がロードされた後にそのイベントに登録する必要があります。その後、データが渡されます。

ただし、子オブジェクトへの親登録が原因で、子 SWF がメモリから適切にアンロードされない可能性があるため、これは理想的ではない可能性があります (最初にすべての登録を削除する必要があります)。

個人的には、アプリケーションのディレクトリとして機能する静的クラスを作成することをお勧めします。各 swf はこのクラスをロードし、必要に応じて関連するメソッドをリストします。例えば:

package com.atriace {
    public class Directory {
        public static var methods:Object = {

        }
    }
}

application.swf が読み込まれると、メソッド オブジェクトにグレーディング関数が読み込まれます。後続の子 swfs もこの静的クラスをロードし、グレード メソッドが事前設定されていることを期待します。

アプリケーション.swf

import com.atriace.Directory;
Directory.methods["grade"] = gradeAnswer;

子.swf

import com.atriace.Directory;
Directory.methods["grade"](answers);
于 2013-03-29T13:44:11.837 に答える
0

この種の質問はスタック オーバーフローで何度も回答されているためかどうかはわかりません。とにかく、ここに私の見解があります..

三角法に取り組んでいるユーザーが、正しいと信じている三角関数 (sin、cos、または tan) を入力し、それらが正しいかどうかを「チェック」できるようにしたいと考えています。

彼らは答えを入力しなければならないので、入力テキストボックスがあると思いますか?また、回答が完了したら、ボタンを押して回答を「送信」しますか? 私が正しい方向に進んでいると仮定すると、この方法でそれを行うことができます...

注: answer_txt (文字列) = ユーザーが外部クラスで指定した回答、input_txt = ユーザー入力用のテキスト フィールド

メインクラスには次のようなものがあります

import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.*;

import ExternalClass; //your class file attached to relevant topic swf

public class Main extends MovieClip 
{
    private var _extClass = new ExternalClass(); //create reference to external Class

    public function Main() 
   {
    //Ref 1 means do that function when trigger event received from external class 
    stage.addChild(_extClass); //gives access to "stage" for ExternalClass.as
    _extClass.addEventListener("Check_Answer", indicate_right_wrong); //see Ref 1
   }

 private function indicate_right_wrong (e:Event)
{
 //your answer checking code. 
 //Access answer_txt variable from external class like example below
 //_extClass.answer_txt.text = " ";
}

外部クラス (Trigonometry.as??) で、次のような設定を行うことができます。answer_txt が存在することを確認してください ( public var answer_txt:String;)..

public function  Question_1 () : void
{
 //your code for question + set submit button
 submit_BTN.addEventListener(MouseEvent.CLICK, send_Answer);
}

function send_Answer(e:MouseEvent):void 
{
 answer_txt = input_txt.text; //set input text as final answer
 trace("final answer is..." + answer_txt); //just to test it's there  

 dispatchEvent (new Event ("Check_Answer")); //Main class is waiting for this event (ref 1)
 trace ("event dispatched.." + dispatchEvent); //to confirm it was despatched
}
于 2013-03-29T14:03:21.573 に答える