2012-03-30 90 views
1

我正在开发一个网站,需要与AIR应用程序进行通信,我使用JavaScript进行开发,并且对动作不太了解。我处于早期阶段,我正在使用Adobe Flash试用版来创建一些可以与javascript进行通信的swf文件,Action窗口中的代码如下所示(大部分内容来自web示例):从Adobe Flash移动到FlashDevelop

import flash.external.ExternalInterface; 

var myText:String = "Example String"; 

ExternalInterface.addCallback("sendOutput", sendStaticTextFromAS3); 
function sendStaticTextFromAS3():void { 
    ExternalInterface.call("receiveTextFromAS3", myText); 
} 

这一切正在做的是接收从JavaScript调用,并发送回一个字符串,并要求将处理它的函数(它会变得更加复杂)。

我的问题是,Flash即将到期,并为未来验证项目,而不必花费在Flash上​​很多我想进入FlashDevelop。因为我不需要舞台上的任何对象,所以我需要编辑actionscript,所以我需要FlashDevelop。我创建的FlashDevelop一个新的AS3项目,我得到这个给出代码:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    /** 
    * ... 
    * @author Will Thomas 
    */ 
    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
     } 

    } 

} 

我猜的Adobe Flash会将此自动编译SWF的时候,所以我不知道在哪里我的代码应该去,除了添加import flash.external.ExternalInterface;在顶部?

任何帮助将不胜感激,希望它是一个简单的复制和粘贴的东西。

谢谢大家。

回答

8

您正在查看的是顶级类文档 - 本例中描述了一个名为Main的类,它扩展了Sprite(所有将被编译为.swfs的顶级文档扩展了Sprite或MovieClip )。

你是对的,Flash Professional基本上隐藏了你的内容(尽管你可以到文档类中进行挖掘)。但Flash Professional是一个非常有创意的工具(用于绘制/动画)。尽管可以使用它来编写ActionScript代码,但这并不一定是它的优势。

FlashDevelop是一个免费的IDE(不幸仅适用于Windows)与Adobe的Flash Builder竞争。这些适用于actionscript软件开发。这些IDE对于初学者来说非常方便,因为它们将自动下载并安装所有必要的SDK,自动执行构建过程,提供项目模板,代码完成和调试,这些都集中在IDE中。

如果您希望使用IDE来帮助您开始,那么其中任何一个应该都可以正常工作(尽管Flash Builder是一个商业工具,我相信Flash Develop是免费的)。

但是请注意,您不需要IDE,并且可以使用完全免费的Adobe工具将.as源代码文件编译为.swf文件 - 使用Adobe Flex SDK。这是一个可在Windows,Mac和Linux上运行的命令行编译器,因此您将使用您选择的文本编辑器来编辑.as文件。如果这是您首选的工作流程,请参阅this tutorial以帮助您入门。

我也推荐使用this excellent article开始flash游戏开发 - 它充满了很棒的信息和教程链接。

至于你的问题,你的代码去,是的,导入与其他人的顶部,你的addCallback语句根据“入口点”评论,并且该函数成为Main类的函数(只是像init函数 - 在一个类中它将需要一个范围声明,如public,protected或private)。当您将变量会将myText取决于当你会想要改变它,但是这应该现在做的事:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.external.ExternalInterface; 

    /** 
    * ... 
    * @author Will Thomas 
    */ 
    public class Main extends Sprite 
    { 
    public function Main():void 
    { 
     if (stage) init(); 
     else addEventListener(Event.ADDED_TO_STAGE, init); 
    } 

    private function init(e:Event = null):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     // entry point 

     ExternalInterface.addCallback("sendOutput", sendStaticTextFromAS3); 
    } 

    protected function sendStaticTextFromAS3():void { 
     var myText:String = "Example String"; 
     ExternalInterface.call("receiveTextFromAS3", myText); 
    } 

    } 

} 

如果我还记得ExternalInterface.addCallback是如何工作的,它看起来像什么,这将做的是,当您从javascript调用sendOutput()时,它将调用ActionScript中的sendStaticTextFromAS3方法,该方法会将“示例字符串”发送回receiveTextFromAS3()JavaScript函数 - 这是一种回送。你可能会一个一个函数来处理你的JavaScript至AS3通信,而一个单独的函数处理您的AS3到JavaScript的通讯:

private function init(e:Event = null):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     // entry point 

     // Setup js-to-as listener 
     ExternalInterface.addCallback("sendTextToAS3", receiveTextFromJS); 

     // Send example text to js 
     sendTextFromAS3("Hello from ActionScript!"); 
    } 

    protected function receiveTextFromJS(text:String):void { 
     trace("Received text from js: "+text); 
     // TODO: do something with it 
    } 

    protected function sendTextFromAS3(text:String):void { 
     ExternalInterface.call("receiveTextFromAS3", text); 
    } 

你还应该注意,有安全限制使用的addCallback中所描述的ExternalInterface documentation(您的SWF必须嵌入在设置了allowScriptAccess参数的网页上)。

希望这会有所帮助。 =)

+0

绝对有帮助,谢谢你应该给我一条腿 – will900 2012-03-30 20:34:56

+0

很好的详细答案! +1 – 2012-09-20 16:49:19