Actionscript 3 Flash开发、Flash语言(AS2/3)和Flash IDE的隐藏特性/技巧
伙计们,我完全惊讶于我已经跟踪了一段时间的帖子中还没有Flash隐藏功能 有一个最近的,但它不是很活跃,我不完全是指当我在这里说Flash的时候只有3个 “隐藏功能”系列适合于不熟悉某种语言的人。它在一个地方展示了绳子和一些有价值的技巧。我认为这是个好主意。甚至专家有时也会发现一些他们从未听说过的把戏 当我开始使用Flash时,与其他编程语言相比,flashide和Flash的奇怪概念让我大吃一惊 那么,下面是:Flash作为语言(AS2/3)和Flash IDE的一些隐藏特性是什么 让乐趣开始吧Actionscript 3 Flash开发、Flash语言(AS2/3)和Flash IDE的隐藏特性/技巧,actionscript-3,flash,actionscript,ide,Actionscript 3,Flash,Actionscript,Ide,伙计们,我完全惊讶于我已经跟踪了一段时间的帖子中还没有Flash隐藏功能 有一个最近的,但它不是很活跃,我不完全是指当我在这里说Flash的时候只有3个 “隐藏功能”系列适合于不熟悉某种语言的人。它在一个地方展示了绳子和一些有价值的技巧。我认为这是个好主意。甚至专家有时也会发现一些他们从未听说过的把戏 当我开始使用Flash时,与其他编程语言相比,flashide和Flash的奇怪概念让我大吃一惊 那么,下面是:Flash作为语言(AS2/3)和Flash IDE的一些隐藏特性是什么 让乐趣开始
Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;
它没有任何地方的记录,但有一个 它不是真正隐藏的(在文档中非常模糊),但在某些情况下是一种未知且有用的方法…ActionScript 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' ...
对象::\uuuu proto\uuuu
。。。允许您更改对象的原型,该原型可用于运行时重新分类:
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
允许将any函数作为方法应用于any对象:
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)
使用上述三种方法,可以将带有参数
param_1,…,param_n
的类MyClass
的实例化编写为:
var instance = {};
instance.__proto__ = MyClass.prototype;
MyClass.call(instance, param_1, ..., param_n);
Function::push
和Function::apply
的相关性在于这个
只是一个函数参数,它是自动传递的。。。与任何其他函数参数一样,它可以写入
var f:Function = function () {
this = [];
this.push(1,2,3);
trace(this);//1,2,3
this = _root;
trace(this);//_level0
}
f();
对象::\u解析
。。。设置此方法允许您对未定义属性的查找作出反应。。。这对于代理、模拟、合成、委派等都很有趣和有用
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]
导入mx.utils.Delegate;
杰克:卡彭特=。。。
吉姆:铁匠=。。。
...
变量:数组=[jack,jim,…]
var o={uuuu解析:函数(名称:字符串){
for(变量i:Number=0;i
现在就这样了…还有很多…事情很简单,AS2是一种令人兴奋的语言,但速度非常慢…相比之下,AS3非常无聊,但速度的提高真的很棒 格里茨 back2dos[AS3]
|
(逻辑或)运算符可用于任何真/假值
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
[AS3]
我不一定把这称为“功能”,但实际上,由于编译器的工作方式,您可以在定义变量之前访问变量(即使使用严格编译):
trace(hb); // null
var hb : HBox = new HBox;
trace(hb); // [object]
在重构代码时,它实际上会导致挫折(因为它是编译的)。[AS3]
当寻找变量的值时,播放器将沿着作用域链运行,直到找到它要查找的内容。因此,使用嵌套(匿名)函数,您可以进行异步调用,并使用在调用方法的作用域上定义的变量进行处理
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"));
}
它还有很多其他用途,非常有用
这不是一个特性,而是一个问题。当为FLA指定文档类时,编译器不会对该类进行子类化,而是对其进行修改
当您有几个具有相同文档类的SWF,并且所有SWF都加载到另一个SWF中时(因为不能将两个具有相同名称的类并排加载到同一个应用程序域中),这可能会导致问题。这会导致第一个SWF被加载,而第二个SWF使用第一个修改过的类,从而产生奇怪的错误(如您所想象的)
解决办法是:
- 为文档类的子类创建每个FLA的代理类
- 将每个SWF加载到新的子应用程序域中
- [Flash IDE]
将MovieClip导出为swc时,可以通过将其放入文件夹将其添加到的“组件”面板
C:\Documents and Settings\USER\u NAME\Local Settings\Application Data\Adobe\Flash CS3\en\Configuration\Components\SOME\u COMPONENT\u文件夹
重新启动flash,它将出现在组件面板中供您使用。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);
}
}
}
function addFrameLabelScript(框架:字符串,函数:函数):void{
变量标签:数组=当前标签;
对于(var i:int=0;i自定义元数据不是很好的文档化或升级,但它非常有用-无需修改变量或更改其名称空间,您可以像在J中一样为其提供自定义注释
trace("Hello","World");
trace("Hello "+"World");
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);
function getFlashVars():Object {
return Object(LoaderInfo(this.loaderInfo).parameters);
localVar = getFlashVars().sampleVar || "default.xml";
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);
// 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
}
<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!"/>
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;
}
}
}
var list : Vector.<Object> = new Vector.<Object>();
var list : Vector.<Object> = new <Object>[];
var list : Vector.<Object> = new <Object>["one", "two", "three"];