Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flash开发、Flash语言(AS2/3)和Flash IDE的隐藏特性/技巧_Actionscript 3_Flash_Actionscript_Ide - Fatal编程技术网

Actionscript 3 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的一些隐藏特性是什么 让乐趣开始

伙计们,我完全惊讶于我已经跟踪了一段时间的帖子中还没有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"];