0

我正在编写使用单个“应用程序”swf 的教育软件,它加载外部“主题”swf 文件(包含特定于主题的库项目)。这些外部“主题” swf 文件中的每一个还利用自定义类来解决特定于主题的计算(例如 trigonometry.swf 主题文件的三角类)。

我希望 trigonometry.swf 的三角类能够引用存在于主“应用程序”swf 中的自定义类方法。如果有助于了解上下文,我希望从事三角学工作的用户能够输入认为正确的三角函数(sin、cos 或 tan)并“检查”以查看它们是否正确。“indicate_right_wrong”方法存在于主“应用程序”swf 的“grader”自定义类中(因此我对此类所做的任何更改都将在所有主题中更新)。那么...如何从外部加载的 swf 文件自己的自定义类中引用主 swf 的自定义类方法?

当我将“grader”自定义类导入每个“topic”swf 并直接引用它时,结果确实有效,但如果我对“grader”进行更改,我不想重新发布每个主题 swf “自定义类。因此,当它存在于主“应用程序”swf 中时,我试图让每个主题都能够引用“grader”自定义类。

当我尝试使用 parent 或 parent.parent 的变体时得到的错误是property grader_class not found on flash.display.Stage(对于 parent)和Cannot access a property or method of a null object reference.(当使用 parent.parent 时)。

感谢您提供任何帮助。

4

2 回答 2

1

您无法编译调用在正在编译的代码中找不到的方法的代码。但是,您可以通过评估方法来进行运行时调用。例如:

stage["myfunction"](args);

然而,虽然您可以创建某种路径逻辑来引用您的方法,正如George Profenza指出的那样,如果您只是将函数侦听器传递给已调度的事件或方法调用,您的成功将会更高(并且更容易使用)。

例如,假设您有一个CHECK_ANSWER在用户输入答案时触发的自定义事件。您的gradeAnswer()函数(存在于“application.swf”中)需要在加载子“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

不知道是不是因为这种问题在 Stack Overflow 上已经回答过很多次了。无论如何,这是我的看法。

我希望从事三角学工作的用户能够输入认为正确的三角函数(sin、cos 或 tan)并“检查”它们是否正确。

我假设因为他们必须输入答案,所以你有一个输入文本框?另外,当他们回答后,他们按下按钮“提交”他们的答案?假设我在正确的路线上,我们可以这样做......

注意: answer_txt (string) = 用户在外部类中给出的答案,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 回答