在ActionScript 2项目中,我可以创建一个新的MovieClip,在库上右键单击它,然后选择“组件定义”以添加可在MovieClip中引用的参数。可以在MovieClips的属性中轻松更改此参数。
现在,我正在开发一个ActionScript 3项目,但却无法找到获取这些参数中传递的值的方法。
我定义了一个名为“textToDisplay”的参数,但是当我在第一帧的Actions中写下以下内容时出现错误:
trace(textToDisplay);
这是错误:
1120: Access of undefined property textToDisplay.
您知道如何捕获该参数的值吗?
由于
PS:我在Windows XP上使用Adobe Flash CS3 Professional
答案 0 :(得分:4)
考虑到找到有关自定义组件设置的信息有多难,我想我会根据自己的经验清理流程的某些方面。
INIT EVENT:
在大多数情况下,上面的aaaidan示例是正确的,只有一个例外。
addEventListener(Event.INIT, onInit);
应该是:
loaderInfo.addEventListener(Event.INIT, onInit);
DisplayObject的loaderInfo属性引用一个LoaderInfo,组件从中获取其参数设置。获取其数据时调用INIT事件(或者可以使用COMPLETE事件,该事件应该在INIT之后直接触发)
INSPECTABLEABLE METADATA:
当您使用元数据[Inspectable]标签设置要访问的属性时,您还可以使用以下方法定义默认值:
[Inspectable(defaultValue="whatevervalue")]
根据我的经验,参数似乎在处理除字符串之外的任何事情(可能还有数字)时遇到问题,所以我建议使用带有字符串值的set函数并使用它们来获取您可能想要的其他值。例如,如果要加载特定命名类的新实例
[Inspectable(defaultValue="flash.display.Sprite")]
public function set className(value:String):void{
var ClassReference:Class = getDefinitionByName(value) as Class;
_class = new ClassReference();
}
在此示例中,如果参数设置为“flash.display.Sprite”,则调用“new _class()将创建一个新的Sprite实例。
设置功能:
如果您希望自定义组件以其他方式调整大小,只需拉伸高度和宽度值,则需要公共setSize函数。每次在闪存中调整组件大小时都会调用此函数。
public function setSize(w:Number, h:Number):void{
_menuWidth = w;
_menuHeight = h;
}
现在当你在flash中调整组件大小时这很有用但是一旦你实际发布你的swf文件,你会发现它切换回拉伸宽度和高度而不是使用你的setSize函数(我不知道为什么,但那就是它的作用) )。为了解决这个问题,你需要在onInit函数中获取宽度和高度,将它们输入setSize,然后将scaleX和scaleY值重置为1:
public function onInit(e:Event):void{
setSize(width,height);
scaleX = 1;
scaleY = 1;
//add other functions that need to be run once the parameters are loaded
}
(如果有人发现这样做的方法不那么混乱,请告知)
希望这有助于某人启动并运行自定义组件。
答案 1 :(得分:2)
最后让它工作(使用基本的MovieClip到目前为止没有太多扩展)。我有两个要添加的内容:
[Inspectable]
标记,但完全忽略其余代码。甚至是类的构造函数中的东西。[Inspectable]
标记中的默认值在编译时似乎不起作用,或者更确切地说会导致null
。我只在组件参数框中使用了一个字符串,但是跟踪了null
。即使在Event.INIT
之后(我正在跟踪点击)。它似乎不是“值未结转”的情况,因为手动输入默认值仍将导致null
。在[Inspectable]
中设置默认值可以有效地定义无法使用的值。P.S。使用CS5。
答案 2 :(得分:1)
在as3中,您必须创建一个包含一个或多个public var
声明的外部类文件(您还可以使用公共get
/ set
函数)。谷歌,如果你不确定如何。
在您的外部文件中,使用[Inspectable]
之前的var
元数据标记,如下所示:
package myPackage {
import flash.display.MovieClip;
public class MyComponent extends MovieClip {
[Inspectable]
public var myFancyComponentParameter:String;
[Inspectable]
public var myOtherFancyComponentParameter:int;
}
}
然后,您可以打开“组件定义”对话框,将“类”字段设置为外部类的名称(包括包名称),Flash将根据您的[Inspectable]
标记自动为组件创建参数。或者您可以手动创建它们。
完成此设置后,您可以在时间轴代码中访问组件变量:
trace("Here's my var: " + myFancyComponentParameter);
有[Inspectable]
标记(包括数据类型)的详细信息,请访问metadata livedocs。
如果您希望外部类除了保持组件值之外还执行任何操作,那么在链接对话框中设置类名也是一个好主意。
我还建议将代码放在外部类中,而不是放在时间轴中。这种方式更具扩展性。如果这样做,请记住在触发INIT
事件之后才会设置组件参数。以下是如何倾听:
// package and import statements omitted for brevity
public class MyComponent extends MovieClip {
[Inspectable]
public var myFancyComponentParameter:String;
public function MyComponent() {
// myFancyComponentParameter not set here yet
trace(myFancyComponentParameter); // prints null
addEventListener(Event.INIT, onInit);
}
public function onInit(e:Event) {
// now we can use component parameters!
trace(myFancyComponentParameter); // prints the param value
}
}
答案 3 :(得分:0)
我没有使用过这个特定的功能,但是您可能需要为该MovieClip定义一个自定义类(只是子类MovieClip)并添加该额外变量。 Actionscript 3已经摆脱了动作脚本2的动态特性,这可能有点令人困惑,但最终它更加强大。
答案 4 :(得分:0)
我没有在MovieClip类定义中看到INIT事件,似乎没有调用它。
答案 5 :(得分:0)
我遇到了同样的问题 - MovieClip没有INIT事件 - 但是否则这个解决方案工作正常。我能看到解决这个问题的唯一方法是使用Event.ENTER_FRAME并在第一次调用处理程序时再次删除侦听器。我的组件参数可以从下一帧开始访问,但我发现在实例化影片剪辑时没有正式事件令人惊讶。
答案 6 :(得分:0)
有一个ADDED_TO_STAGE事件比steve-mann建议的ENTER_FRAME事件更好。
答案 7 :(得分:0)
在CS4 10.0.2版本中,您可以再次右键单击并手动添加组件参数。
有两点需要注意:
希望这有助于你......我知道它对我有所帮助!
〜格雷格