使用MovieClip作为AS3中的参数

时间:2013-01-05 03:25:43

标签: actionscript-3 class parameters instance movieclip

我在将MovieClip附加到类的不同实例时遇到问题。老实说,我对ActionScript 3有点新意,所以这个问题可能有点小说。不过,我做了这项研究,但没有找到我所期望的那种答案。

function AddNewElement(clip:MovieClip, array:Array, name:String, firstValue:int, secondValue:int):Element

正如您可能猜到的,这是我以动态方式创建类的实例并将它们添加到数组中的函数。不过,我遇到了第一个参数的问题。如何将MovieClip从我的库传递到此函数?

我看到很多类似于这个问题的答案,说明每个MovieClip应该是一个独立的类,但是因为我有四十个MC并且我想要使用它们或多或少是同样的东西我觉得它真的会杀死课程的目的。

我该如何处理?

3 个答案:

答案 0 :(得分:1)

首先,您需要在导出时或从“属性”选项中稍后从链接部分为您的库符号指定唯一的类名称。当您检查“Export for ActionScript”选项时,您将看到此输入。然后,您需要实例化您的库符号(使用new关键字)并将其强制转换为MovieClip以传递给此函数。所以

  • AddNewElement(new LibrarySymbolClass() as MovieClip,[],'etc',0,0);
  • AddNewElement(MovieClip(new LibrarySymbolClass()),[],'etc',0,0);

会让你做你想做的事。

但是,由于并非所有库元素都需要扩展MovieClip类,因此最好选择DisplayObject而不是MovieClip。所以你的函数的更好版本将是

import flash.display.DisplayObject;

function AddNewElement(clip:DisplayObject, ...):* {
    // some code here
    return clip;
}
var clip:LibrarySymbolClass = AddNewElement(new LibrarySymbolClass() as DisplayObject,[],'etc',0,0);
trace(clip);

在返回值类型中使用星号将允许它返回具有正确类型的对象(在此示例中为[object LibrarySymbolClass])。

答案 1 :(得分:0)

在Flash中创建MovieClip时,它会为您提供某些选项,其中一个选项是Flash为该MovieClip创建一个类。话虽如此,如果您将该选项应用于所有四十个影片剪辑,那么您可以创建类似主影片剪辑类的内容,并让每个影片剪辑类扩展主影片剪辑类。唯一的事情是您必须为40个影片剪辑中的每一个创建一个.as文件,并将extends MasterMovieClip添加到类声明中。例如:

public class MasterMovieClip extends MovieClip {
    // All of the variables and methods pertaining to each movie clip go here
}


然后每个单独的影片剪辑都类似于这个类。

public class IndividualMovieClip_1 extends MasterMovieClip {
    // Just include a constructor, even though you don't have to
}


现在,只要所述方法和变量是公共的,而不是私有的,所有单个影片剪辑都将具有相同的方法和变量。

使用此方法,您必须创建所有40个类,但是在创建新影片剪辑时可能有一种方法可以设置影片剪辑扩展的类,然后您不必创建40个不同的类。



更新

我重新阅读了你的问题并想到了别的东西,我在第一句中谈到的那个选项,一个关于Flash的选项,可以创建一个类。好吧,如果没有给出类,那么Flash将在运行时动态创建一个类。我认为当它动态创建一个类时,它不会与库影片剪辑保持相同的名称,所以当你试图将影片剪辑的静态名称传递给你的函数时,它不知道你在说什么并抛出一个运行时错误。

答案 2 :(得分:0)

为什么不在运行时创建影片剪辑呢?在运行时执行上下文中创建它们,然后在调用类时实例化每个上下文。如果每个MC都不同,那么要么为每个MC创建一个MC类,给它们一个以升序数字结尾的名称,然后使用for循环将它们放在一个数组中,如下所示:

var mc_num:int = 40 // the number of MovieClips
var arr:Array = new Array();

for (var i:int=0; i < mc_num; i++) {
    arr.push("myMovieClip" + String(i)); 
}

..然后使用数组索引引用它们中的每一个。我跳过了将图像与MovieClips相关联的部分。

之后,您将调用所需的MC,如下所示:

var mc_1:MovieClip = arr[1] as MovieClip;
stage.addChild(mc_1);