0

使用 AS3 / Flash CS4

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

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

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

现在为了练习良好的编码,我决定从 runtime_loaded.fla 中删除 UI,并将其添加到 Main.fla。这是必不可少的,因为 main 将处理可能的 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:在 ThreedsKU39web 上找不到属性 rotateRight,并且没有默认值。在 MethodInfo-82() ReferenceError:错误 #1069:在 ThreedsKU39web 上找不到属性 rotateLeft,并且没有默认值。在 MethodInfo-83()

4

1 回答 1

0

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

答案在运行时加载的 swf 类的函数中。

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

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

于 2010-12-11T16:12:31.263 回答