Подтвердить что ты не робот

Скрытые функции/разработки Flash-разработки, язык Flash (AS2/3) и Flash IDE

Ребята, я полностью удивлен тем, что в разделе Hidden Feature нет ссылок на Flash Hidden Features, которые я отслеживал для через некоторое время.

Существует недавний AS3/Flex один, но он не очень активен, и я не совсем точно говорю о AS3, когда я говорю Flash здесь.

Серия Hidden Features отлично подходит для людей, которые не знакомы с определенным языком. Он показывает веревки и некоторые ценные трюки, все в одном месте. Я думаю, это блестящая идея. Даже эксперты иногда находят трюки, о которых они никогда не слышали.

Когда я начал с Flash, я был ошеломлен Flash IDE и нечетными концепциями Flash, по сравнению с другими языками программирования.

Итак, вот что: некоторые скрытые функции Flash как язык (AS2/3) и Flash IDE

Пусть начинается забава.

4b9b3361

Ответ 1

[Flash IDE]

Это не особенность, так как она есть. При указании класса документа для FLA компилятор не подклассифицирует этот класс, он изменяет его.

Это может вызвать проблемы, когда у вас есть несколько SWF с тем же классом документов, все они загружаются в другой SWF (так как два класса с одинаковым именем нельзя загружать бок о бок в один и тот же домен приложения). Это приводит к тому, что первый загружается, а второй - с использованием первого модифицированного класса, создавая странные ошибки (как вы можете себе представить).

Решение: либо

  • Создайте класс прокси для каждой FLA, которая подклассы класса документа
  • Загрузите каждый SWF в новый дочерний домен приложения

Ответ 2

[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);

Ответ 3

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);
        }
    }
} 

Ответ 4

Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;

Это не документировано нигде, но сообщение форума объясняет больше.

Ответ 5

[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

Ответ 6

[AS3]

Когда вы используете оператор trace в AS3, вы можете передать несколько параметров, и AS3 будет форматировать вывод так, чтобы между ними было пробел.

trace("Hello","World");

выводит "Hello World".

AS2 не поддерживает несколько параметров для трассировки, поэтому вы вынуждены делать что-то вроде

trace("Hello "+"World");

Ответ 7

[AS3]

var list : Vector.<Object> = new Vector.<Object>();

становится немного короче, записывая

var list : Vector.<Object> = new <Object>[];

Вы можете даже предопределить значения:

var list : Vector.<Object> = new <Object>["one", "two", "three"];

Ответ 8

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' ...

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 переклассифицируется в Array... довольно круто, да?:)


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... Этот метод позволяет вам реагировать на поиск по свойствам undefined... это весело и полезно для проксирования, издевательств, составления, делегирования и т.д....

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 в сравнении скучно, как черт, но увеличение скорости действительно отлично...

Greetz

back2dos

Ответ 9

[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"));

}

Загрузка других видов использования для этого, и это действительно очень полезно

Ответ 11

Для тех из вас, кто использует 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
}

Подробнее об этом здесь

Ответ 12

На самом деле он не скрыт (очень скрыт в документации), но updateAfterEvent - довольно неизвестный и полезный метод при определенных обстоятельствах...

Ответ 13

[AS3]

Я бы не стал называть это "функцией", но вы можете фактически получить доступ к переменным до их определения (даже при строгой компиляции) из-за того, как работает компилятор:

trace(hb); // null
var hb : HBox = new HBox;
trace(hb); // [object]

Это может привести к разочарованию при рефакторинге кода (поскольку он компилируется).

Ответ 14

[Flash IDE]

При экспорте MovieClip в качестве swc вы можете добавить его на панель компонентов, отбросив его в папку

C:\Documents and Settings\USER_NAME\Локальные настройки\Данные приложения \Adobe\Flash CS3\en\Конфигурация\Компоненты\SOME_COMPONENT_FOLDER

Перезагрузите флеш-память, и она будет использоваться на панели компонентов.

Ответ 15

Ну, это может быть не скрытая функция, но, возможно, люди пропустили, что есть внешние движки для tweening, которые вы можете использовать. Моим последним фаворитом является Greensocks. Единственное, на мой взгляд, это недоставало, кажется, улучшается, рабочий процесс. Не протестировал v.11 еще, но определенно будет в моем следующем проекте AS: http://blog.greensock.com/v11beta/

Ответ 16

Не совсем скрыто, но как насчет часто пропускаемого макроса "включить" (да, он все еще существует в as3)? - очень полезно для фальсификации множественного наследования (при использовании бок о бок с интерфейсом), даже если это обычно является плохой практикой.

Ответ 17

при использовании flashvars напишите метод утилиты getFlashVars().

function getFlashVars():Object {
return Object(LoaderInfo(this.loaderInfo).parameters);

}

тогда, когда я кодирую, я всегда добавляю дополнительный || так что во время отладки я не буду использовать flashvars.

localVar = getFlashVars().sampleVar || "default.xml";

Ответ 19

[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);

Ответ 20

Здесь что-то большинство людей не знает: MouseEvents отслеживаются вне окна приложения, если событие MOUSE_DOWN запущено, но не 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!"/>

Ответ 21

Этот пакет предоставит вам все объекты DisplayObjects в DisplayObjectContainer, установив типы классов.

Примечание. Он не будет считать кадры в MovieClips.

package {

import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.utils.getQualifiedClassName;

/**
 * 
 * @author Cansın Şenalioğly @ [email protected]mail.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;
    }
}
}

Ответ 22

В Flash Professional вы можете изменить символ MovieClip на Sprite, перенаправив его базовый класс от flash.display.MovieClip до flash.display.Sprite, а цвет значка символа в библиотеке изменится с синего на зеленый.

enter image description here

enter image description here

Ответ 23

Пользовательские метаданные не являются хорошо документированными или продвинутыми, но это очень полезно - без изменения переменной или изменения ее пространства имен вы можете дать ей пользовательские аннотации, аналогичные тому, как вы можете на Java.

Он подробно перешел на Christophe Conraets на его блог.

Простота в том, что вы можете поместить все свои собственные метаданные, а затем просто используйте describeType(), и во время выполнения вы увидите все свои метаданные:)

Ответ 24

Вот еще один вопрос:

По умолчанию инструменты Flash разбивают любые теги метаданных, которые у вас есть. Многие фреймворки зависят от этих тегов метаданных. Что нужно быть осторожным, так это то, что это относится не только к компилятору, но и к оптимизатору. Обязательно запустите как свой компилятор, так и оптимизатор с помощью параметра -keep-as3-metadata-tag, чтобы сохранить там тэг метаданных.