在运行时加载的swf中调用函数

时间:2010-12-11 16:07:41

标签: actionscript-3 flash cs4

使用AS3 / Flash CS4

好的,感谢所有阅读此内容的人。我的问题具体是我正在设计一个带有控件的用户界面。 5个按钮向左旋转,向右旋转,放大,缩小和自动旋转。界面本身工作正常,我可以追踪按钮点击,切换自动旋转按钮等...

我的程序读取xml文件。加载一些图像,使用每个图像的链接填充数组,单击图像时,加载程序从URL加载swf并将其显示在屏幕上。没问题。

现在我最初在runtime_loaded.fla库中有缩放控件用户界面,在同一个链接文档类中有鼠标侦听器。当接口在同一代码中时,该接口与runtime_loaded.swf中的movieClip一起使用。

现在要练习良好的编码,我决定从runtime_loaded.fla中删除UI并将其添加到Main.fla中。这是必不可少的,因为主要是处理可能的100个图像/对象,每个图像/对象都有自己独特的swf链接。如果我决定更改接口的外观但保持函数调用相同,我基本上可以在main.fla中输入尽可能多的内容而不是每个对象必须执行的runtime_loaded.fla

文件结构

Main.fla <- interface in the library. 5 mouse event functions. Inside each function calls
           a property of loaded_swf (loaded_swf.rotateLeft, loaded_swf.rotateRight) etc...
Runtime_loaded.fla <- links specificObject.as in properties (AS3/CS4)
specificObject.as <- has 5 public static functions{ rotateRight, rotateLeft, zoomIn, zoomOut, toggleAutoRotate }

代码

    //showFlashBox
function showFlashBox(temp_string:String):void {
 if(!flash_box_on){
 var temp_top:uint = numChildren;
 addChildAt(FlashBoxContainer,temp_top);
 newXButton.addEventListener(MouseEvent.CLICK,  flashBoxXClick);

1. addChild(new_loader); 
2. var url:URLRequest = new URLRequest(temp_string);
 new_loader.x = 0;
 new_loader.y = 0;
 new_loader.load(url);
3. new_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotSwf);

 flash_box_on = true;
 }
 }

 function gotSwf(e:Event){
4.  //loaded_swf = e.target.content;
  trace(e.target.content);
5.   new_zoom_controls.button_minus.addEventListener(MouseEvent.CLICK, zoomOutFunction);
   new_zoom_controls.button_plus.addEventListener(MouseEvent.CLICK, zoomInFunction);
   new_zoom_controls.button_left.addEventListener(MouseEvent.CLICK, rotateLeftFunction);
   new_zoom_controls.button_right.addEventListener(MouseEvent.CLICK, rotateRightFunction);
   new_zoom_controls.button_rotate.addEventListener(MouseEvent.CLICK, toggleRotateFunction);
   function rotateRightFunction(e:MouseEvent){
6.    //loaded_swf.rotateRight();
   }
   function rotateLeftFunction(e:MouseEvent){
    //loaded_swf.rotateLeft();
   }
   function zoomInFunction(e:MouseEvent){
    //loaded_swf.zoomIn();
   }
   function zoomOutFunction(e:MouseEvent){
    //loaded_swf.zoomOut();
   }
   function toggleRotateFunction(e:MouseEvent){
    //loaded_swf.toggleAutoRotate();
    if(new_zoom_controls.button_rotate.currentFrame == 1){
     new_zoom_controls.button_rotate.gotoAndStop(2);
    }
    else new_zoom_controls.button_rotate.gotoAndStop(1);
   }
   new_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, gotSwf);
 }

如果你按照步骤1-6看到我加载.swf,鼠标事件监听器和点击处理程序的步骤,然后是var loaded_swf:Object的对象调用;

    public static function rotateLeft():void
  {
    object.yaw(animation_turning_speed);
  }

  public static function rotateRight():void
  {
    object.yaw(-animation_turning_speed);
  }

如果我运行main.fla并尝试单击按钮。发生这种情况。

  

ReferenceError:错误#1069:找不到属性rotateRight   ThreedsKU39web并没有默认值。在MethodInfo-82()   ReferenceError:错误#1069:找不到属性rotateLeft   ThreedsKU39web并没有默认值。在MethodInfo-83()

1 个答案:

答案 0 :(得分:0)

在我完成提交之前,我实际上偶然发现了答案,因为我仔细检查了代码。但在昨晚花了几个小时令人沮丧的时刻之后,我会发布它以确保下一个人不会遇到同样的死亡。

答案在于运行时加载的swf类的功能。

public static function rotateRight():void
{
    object.yaw(-animation_turning_speed);
}

事实证明它只需要是公共功能而不是公共静态。 主要是人为错误,因为在文件工作之后,我试图将代码复制到我的所有其他目标文件,并且不知何故静态回到那里并搞砸了。因此,为了将来在外部swf中加载时的参考,公共函数应该可以解决问题。 *请注意,我的许多变量都返回错误,直到被声明为公共静态。