我正在编写使用单个“应用程序”swf的教育软件,该软件加载外部“主题”swf文件(包含特定于该主题的库项目)。每个外部“主题”swf文件还使用自定义类来解决特定于主题的计算(例如,trigonometry.swf主题文件的三角函数类)。
我希望trigonometry.swf的trigonometry类能够引用主“application”swf中存在的自定义类方法。如果它有助于了解上下文,我希望使用三角函数的用户能够输入相信正确的sin函数(sin,cos或tan)并“检查”以查看它们是否正确。 “indication_right_wrong”方法存在于主“application”swf的“grader”自定义类中(因此我对此类所做的任何更改都将在所有主题中更新)。那么......如何从外部加载的swf文件自己的自定义类中引用主swf的自定义类方法?
当我将“grader”自定义类导入每个“topic”swf并直接引用它时,我的结果是有效的,但如果我对其进行更改,我不希望重新发布每个主题swf “平地机”自定义课程。因此,我试图让每个主题能够引用“grader”自定义类,当它存在于主“应用程序”swf中时。
我尝试使用parent或parent.parent的变体时得到的错误是property grader_class not found on flash.display.Stage
(对于父级)和Cannot access a property or method of a null object reference.
(当使用parent.parent时)。
感谢您提供任何帮助。
答案 0 :(得分: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也会加载此静态类,并期望找到预先填充的成绩方法。
<强> Application.swf 强>
import com.atriace.Directory;
Directory.methods["grade"] = gradeAnswer;
<强> Child.swf 强>
import com.atriace.Directory;
Directory.methods["grade"](answers);
答案 1 :(得分:0)
不知道安静是否因为Stack Overflow之前已经多次回答过这种问题。无论如何,这是我对它的看法..
我希望处理三角函数的用户能够输入trig 功能相信是正确的(罪,cos或棕褐色)和“检查” 看他们是否正确。
我假设因为他们必须输入你有输入文本框的答案吗?当他们回答时,按一个按钮“提交”他们的答案?假设我在正确的路线上,我们可以这样做......
注意: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
}