伙计们,我很惊讶,Hidden Features series中的{<3>}暂时没有Flash 隐藏功能帖子,我现在已经跟踪了一段时间。
最近有一个AS3/Flex one,但它不是很活跃,当我在这里说Flash时,我并不完全是指AS3。
“隐藏的功能”系列非常适合对某种语言不熟悉的人。它在一个地方展示了绳索和某些有价值的技巧。我认为这是个好主意。即使是专家也有时会发现他们从未听说过的伎俩。
当我开始使用Flash时,与其他编程语言相比,我对Flash IDE以及Flash的奇怪概念感到吃惊。
所以,这里有: Flash 的隐藏功能 语言(AS2 / 3)和 Flash IDE
让乐趣开始。
答案 0 :(得分:11)
[AS3]使用数组或向量的提示
通过数组的最快方式,始终从后面
var i:int = array.length;
var item:Object;
while(i--)
{
item = array[i];
}
清除数组
//faster than array = []
array.length = 0;
//garbage friendly
while(array.length)
{
array.pop();
}
推送和拼接
//faster than array.push();
array[array.length] = "pushed value";
//faster than splice(index, 1)
var index:int = array.indexOf(splicee);
array[index] = null;
array.splice(array.length, 1);
克隆
//fastest way to clone
var newArray:Array = array.concat();
//fastest manipulation
var mapFunction:Function = function(item:Object, index:int, source:Array):Object
{
return //your cloning or morphing here
}
var newArray:Array = array.map(mapFunction);
答案 1 :(得分:8)
MovieClip.addFrameScript()是一种未记录的ActionScript 3.0功能,允许您指定当Movieclip时间轴的播放头输入特定帧编号时调用的函数。
function someFunction():void {
}
movieclip_mc.addFrameScript(4,someFunction);
帧数基于零(第一帧= 0)并且只需要是整数,但是如果你想使用帧标签,你可以使用这样的东西:
function addFrameLabelScript(frame:String, func:Function):void{
var labels:Array = currentLabels;
for(var i:int=0;i<labels.length;i++){
if(labels[i].name == frame){
addFrameScript(labels[i].frame-1,func);
}
}
}
答案 2 :(得分:7)
[Flash IDE]
这不是一个功能,因为它是一个陷阱。为FLA指定文档类时,编译器不会对该类进行子类化,它修改它。
当您有多个具有相同文档类的SWF时,这会导致问题,所有SWF都被加载到另一个SWF中(因为两个具有相同名称的类不能并排加载到同一个应用程序域中)。它导致第一个被加载,第二个使用第一个被修改的类,产生奇怪的错误(你可以想象)。
解决方案是:
答案 3 :(得分:5)
Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;
在任何地方都没有记录,只有forum post explains more。
答案 4 :(得分:4)
[AS3]
||
(逻辑或)运算符可用于任何truthy / falsey值。
var obj : Object = nullObject || instance; // instance
var val : int = 5 || 10; // 5
var val : int = 0 || 10; // 10
此外,您可以使用&
和|
(按位和/或)来执行非短路的表达式:
function functionA() { return false; }
function functionB() { return true; }
if (functionA() && functionB()) { trace("something"); } // methodB won't be executed
if (functionA() & functionB()) { trace("something"); } // methodB WILL be executed
答案 5 :(得分:3)
[AS3]
var list : Vector.<Object> = new Vector.<Object>();
通过写
稍微缩短var list : Vector.<Object> = new <Object>[];
您甚至可以预定义值:
var list : Vector.<Object> = new <Object>["one", "two", "three"];
答案 6 :(得分:3)
[AS3]
在AS3中使用trace语句时,可以传入多个参数,AS3将格式化输出,以便每个参数之间有空格。
trace("Hello","World");
将输出“Hello World”。
AS2不支持多个跟踪参数,因此您不得不执行类似
的操作trace("Hello "+"World");
答案 7 :(得分:2)
您可以使用Dictionary对象创建weak references in ActionScript3。
答案 8 :(得分:2)
对于那些使用FlashDevelop的人来说,有一些漂亮的条件编译功能:
// Use it to generate different code paths
CONFIG::debug {
txt.text = "Debug Version running...";
}
CONFIG::release {
txt.text = "Welcome to Stark Industries";
}
// Or use it as a const in code
if ( CONFIG::debug && yourCondition ) {
// Do stuff
}
详细了解here
答案 9 :(得分:2)
[AS3]
当查找变量的值时,播放器将运行范围链,直到找到它正在寻找的内容。因此,使用嵌套(匿名)函数,您可以执行诸如进行异步调用之类的操作,并使用在调用方法范围内定义的变量来处理它。 e.g。
function loadData(myAwesomeObject : AwesomeObject) : void
{
var urlLoader : URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, function(event : Event) : void
{
myAwesomeObject.someReallyAwesomeMethod(event.target);
});
urlLoader.load(new URLRequest("http://someService"));
}
为此加载其他用途,这非常有用
答案 10 :(得分:2)
每个类都是一个函数,每个函数都是一个类...... AS2是基于原型的......
trace.prototype = { };
var f = trace;
trace(new f());//will yield [object Object]
访问Function::prototype
允许在运行时扩展类:
MovieClip.prototype.moo = function () {
trace(this+" says 'moooooooo' ...");
}
_root.moo();//_level0 says 'moooooooo' ...
Object::__proto__
...允许您更改对象的原型,可用于运行时重新分类:
var o = trace;
o.__proto__ = [];
trace(o.push("foo", "bar", "foobar"));//3 here
trace(o.length);//also 3
trace(o[1]);//bar
在这个例子中,函数trace
被重新转换为数组......非常酷,对吧? :)
Function::apply
和Function::call
允许将任何函数用作任何对象的方法:
Array.prototype.push.apply(trace,[1,2,3]);
trace(trace.length);//3
trace(Array.prototype.splice.call(trace, 1,1));//2 ... actually, this is [2] (the array containing 2)
使用上面的三个,实例化具有参数MyClass
的类param_1, ..., param_n
可以写成:
var instance = {};
instance.__proto__ = MyClass.prototype;
MyClass.call(instance, param_1, ..., param_n);
Function::push
和Function::apply
的核心是this
只是一个函数参数,它自动传递...作为任何其他函数参数,它可以写入..
var f:Function = function () {
this = [];
this.push(1,2,3);
trace(this);//1,2,3
this = _root;
trace(this);//_level0
}
f();
Object::__resolve
...设置此方法允许您对未定义属性的查找做出反应...这对于代理,模拟,组合,委派等很有用且有用...
import mx.utils.Delegate;
var jack:Carpenter = ...
var jim:BlackSmith = ...
...
var guys:Array = [jack, jim, ...]
var o = { __resolve : function (name:String) {
for (var i:Number = 0; i < guys.length; i++) {
var guy = guys[i];
if (guy.hasOwnProperty(name)) {
var ret = guy[name];
if (ret instanceof Function) {
ret = Delegate.create(guy, return);
}
return return;
}
}
return "sorry man, but nobody knows, what '" + name + "' means";
});
//some really imaginary stuff (i hope it makes the point):
trace(o.saw);//[object Hammer]
trace(o.anvil);//[object Anvil]
trace(o.ventilator);//"sorry man, but nobody knows, what 'ventilator' means"
trace(o.makeSword());//[object Sword]
现在就是这样......还有更多......简单来说,AS2是一种现存的语言,但速度很慢...... AS3相比之下很无聊,但速度提升真的很快太棒了......
格尔茨
back2dos
答案 11 :(得分:1)
[Flash IDE]
将MovieClip导出为swc时,可以将其添加到组件面板中,方法是将其放入文件夹
C:\ Documents and Settings \ USER_NAME \ Local Settings \ Application Data \ Adobe \ Flash CS3 \ en \ Configuration \ Components \ SOME_COMPONENT_FOLDER
重新启动闪存,它将出现在组件面板中供您使用。
答案 12 :(得分:1)
这可能不是一个隐藏的功能,但也许人们错过了你可以使用的外部补间引擎。我最近的最爱是Greensocks。 在我看来,它唯一缺乏的似乎是改进,工作流程。 尚未测试v.11但是肯定会在我的下一个AS项目上测试: http://blog.greensock.com/v11beta/
答案 13 :(得分:1)
[AS3]
我不一定将其称为“特性”,但由于编译器的工作方式,您实际上可以在定义之前访问变量(即使是严格的编译):
trace(hb); // null
var hb : HBox = new HBox;
trace(hb); // [object]
实际上,在重构代码时可能会导致沮丧(因为它编译)。
答案 14 :(得分:1)
没有完全隐藏,但是经常被忽视的“包含”宏呢(是的,它仍然存在于as3中)? - 对于伪造多重继承非常有用(当与接口并排使用时),即使它通常是一种不好的做法。
答案 15 :(得分:1)
使用flashvars时写一个实用程序方法getFlashVars()。
function getFlashVars():Object {
return Object(LoaderInfo(this.loaderInfo).parameters);
}
然后当我编码时,我总是添加额外的||所以我在调试时不需要flashvars。
localVar = getFlashVars().sampleVar || "default.xml";
答案 16 :(得分:1)
我相信你会发现jp auclair的这篇文章很有用:{{3p>
答案 17 :(得分:1)
[AS3]
基于原型的继承:
import flash.display.MovieClip;
var myRectangle = function(target,x,y){
var internalTarget = target;
var myMovieClip = new MovieClip();
var myGraphic = myMovieClip.graphics;
myGraphic.beginFill(0xAAAAAA);
myGraphic.drawRect(0,0,100,100);
myGraphic.endFill();
trace(typeof internalTarget);
Sprite(internalTarget).addChild(myMovieClip);
myMovieClip.x = x ;
myMovieClip.y = y ;
}
var aRectangle = new myRectangle(this,10,10);
答案 18 :(得分:1)
以下是大多数人不知道的事情:如果触发了MOUSE_DOWN事件,则会在应用程序窗口之外跟踪MouseEvents,而不是MOUSE_UP。您可以在应用程序窗口之外(甚至在浏览器窗口之外)抓取鼠标位置,只要您正在执行的任何操作都会让用户按住鼠标。要测试此操作,请尝试运行以下命令:代码:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="init()">
<fx:Script>
<![CDATA[
protected function init():void {
addEventListener(Event.ADDED_TO_STAGE, magic)
}
protected function magic(e:Event):void {
stage.addEventListener(MouseEvent.MOUSE_MOVE, moreMagic);
}
protected function moreMagic(e:MouseEvent):void {
magicalButton.label = "Hold me down! " + String(e.stageX) + "x" + String(e.stageY);
}
]]>
</fx:Script>
<s:Button id="magicalButton" label="Hold me down!"/>
答案 19 :(得分:1)
这个包将通过设置类类型来获取DisplayObjectContainer中的所有DisplayObject。
注意:它不会计算MovieClips中的帧数。
package {
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.utils.getQualifiedClassName;
/**
*
* @author Cansın Şenalioğly @ cansin.senalioglu@gmail.com
*
*/
//--------------------------------------
// Class description
//--------------------------------------
/**
* <p>Gets all DisplayObject types in DisplayObjectContainer.</p>
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
* @includeExample examples/ButtonExample.as
*
* @playerversion AIR 1.0
*/
public class DisplayObjectFinder
{
/**
*
*
*
* <p>Gets all DisplayObject type in DisplayObjectContainer</p>
* <b>Example:</b><br>
* <p>var items:Array = DisplayObjectFinder.getAllDOTypeInDOC(stage,MovieClip,callBack);<br>
* trace(items.length);<br>
* function callBack(object:MovieClip):void{ trace(object.name) };</p>
*
* @param container Objects parent (DisplayObjectCotainer);
* @param typeClass Objects Class type;
* @param forEach For every object call back function;
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*
* @playerversion AIR 1.0
*/
public static function getAllDOTypeInDOC(container:DisplayObjectContainer,typeClass:Class,forEach:Function=null):Array {
var a:Array = [];
var len:int = container.numChildren;
while(len--){
var o:DisplayObject = container.getChildAt(len);
if(flash.utils.getQualifiedClassName(o) == flash.utils.getQualifiedClassName(typeClass)){
a[a.length] = o;
if(forEach != null)
forEach(o);
}
if(o is DisplayObjectContainer){
var aa:Array = getAllDOTypeInDOC(o as DisplayObjectContainer,typeClass,forEach);
var lena:int = aa.length;
while(lena--){
a[a.length] = aa[lena];
}
}
}
return a;
}
}
}
答案 20 :(得分:1)
在Flash Professional中,您可以通过将其基类从flash.display.MovieClip
重定向到flash.display.Sprite
来将MovieClip符号更改为Sprite,并且库中的符号图标颜色将从蓝色变为绿色。< / p>
答案 21 :(得分:1)
它并没有真正隐藏(在文档中非常模糊),但updateAfterEvent在某些情况下是一个非常未知且有用的方法......
答案 22 :(得分:0)
自定义元数据不是很好地记录或提升的,但它非常有用 - 无需修改变量或更改其命名空间,您可以为其提供类似于Java中的自定义注释。
Christophe Conraets在his blog上深入探讨了这一点。
它的简单之处在于您可以放置所有自己的元数据,然后只需使用describeType()
,您将在运行时看到所有自定义元数据:)
答案 23 :(得分:0)
这是另一个问题:
默认情况下,Flash工具会删除您拥有的所有元数据标签。许多框架依赖于这些元数据标签。您需要注意的是,这不仅适用于编译器,也适用于优化器。请务必使用-keep-as3-metadata-tag选项运行编译器和优化器,以保留元数据标记。