Скрытые функции/приемы разработки Flash, Блатной жаргон (AS2/3) и Flash [закрытый] IDE

Только для добавления ReadOnly для ссылочных типов только делает ссылку, только для чтения не значения. Например:

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}
17
задан 5 revs, 3 users 76% 23 May 2017 в 12:01
поделиться

16 ответов

[Flash IDE]

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

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

Решение следующее:

  • Создайте прокси-класс для каждого FLA, который является подклассом класса документа
  • Загрузите каждый SWF-файл в новый домен дочернего приложения
7
ответ дан 30 November 2019 в 10:19
поделиться

[AS3]

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

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

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

1
ответ дан 30 November 2019 в 10:19
поделиться

[Flash IDE]

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

C: \ Documents and Settings \ USER_NAME \ Local Settings \ Application Data \ Adobe \ Flash CS3 \ en \ Configuration \ Components \ SOME_COMPONENT_FOLDER

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

1
ответ дан 30 November 2019 в 10:19
поделиться

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 и Функция ::

2
ответ дан 30 November 2019 в 10:19
поделиться
Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;

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

5
ответ дан 30 November 2019 в 10:19
поделиться

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

1
ответ дан 30 November 2019 в 10:19
поделиться

На самом деле кажется, что многие люди упустили истинную природу вопроса и даже дошли до языковых дебатов ( они никогда не заканчиваются хорошо).

Есть ли какая-то причина, по которой я не мог перепродать сценарий, построенный на одной из этих сред, в качестве полноценного решения под ключ (особенно, если лицензирование инфраструктуры является чем-то очень гибким, например BSD license)?

Если это разрешено рамочной лицензией, то нет причин, по которым вы не могли бы это сделать. Вы упомянули Zend Framework, поэтому вам может быть интересно посмотреть Magento . Хотя они предлагают бесплатную версию сообщества, у них также есть платная версия, которая также работает с Zend Framework.

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

Если нет, то почему другие не делают то же самое?

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

Многие из существующих крупных игроков на рынке PHP существуют уже некоторое время и уже имеют свою собственную базу кода, которую они создали и с которой они знакомы. Когда вы потратили годы на создание собственных библиотек, трудно оправдать переход на другой фреймворк.

Многие более мелкие игроки редко обучаются правильному дизайну приложений и обычно придерживаются процедурного кода. Большие возможности ООП, существующие в PHP сегодня, появились только в версии 5.0. Имейте в виду, что это было около 5 лет назад, но многие ваши программисты начали свои учебники по PHP и учебные приключения до того, как PHP5 стал широко доступен и принят на стандартных учетных записях хостинга. Таким образом, большинство наших современных фреймворков были недоступны. Например, CakePHP не запускался до 2005 года. Фреймворк Zend не существовал до 2007 года. Таким образом, используя вложенные (анонимные) функции, вы делаете асинхронные вызовы и обрабатываете их, используя переменные, которые были определены в области действия вызывающего метода. например

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

}

Множество других применений для этого, и это действительно очень полезно

2
ответ дан 30 November 2019 в 10:19
поделиться

Вы можете создать слабые ссылки в ActionScript3 с помощью объекта Dictionary.

2
ответ дан 30 November 2019 в 10:19
поделиться

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

1
ответ дан 30 November 2019 в 10:19
поделиться

[AS3]

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

trace("Hello","World");

будет выводить "Привет мир".

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

trace("Hello "+"World");
3
ответ дан 30 November 2019 в 10:19
поделиться

Custom metadata isn't something that's well documented or promoted, but it's very helpful - without modifying a variable or changing its namespace, you can give it custom annotations similar to the way that you can in Java.

It is gone over in depth by Christophe Conraets on his blog.

The simplicity of it is that you can put all of your own metadata, and then you just use describeType() and you will see all of your custom metadata at run time :)

0
ответ дан 30 November 2019 в 10:19
поделиться

MovieClip.addFrameScript () - это недокументированная функция ActionScript 3.0, которая позволяет указать функцию, которая вызывается, когда точка воспроизведения временной шкалы Movieclip вводит конкретный номер кадра.

function someFunction():void {

}

movieclip_mc.addFrameScript(4,someFunction);

Номер кадра отсчитывается от нуля (1-й кадр = 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);
        }
    }
} 
8
ответ дан 30 November 2019 в 10:19
поделиться

[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);
11
ответ дан 30 November 2019 в 10:19
поделиться

[AS3]

The || (logical or) operator can be used for any truthy/falsey values.

var obj : Object = nullObject || instance; // instance
var val : int = 5 || 10; // 5
var val : int = 0 || 10; // 10

Also, you can use & and | (bitwise and/or) to do a non-short-circuted expression:

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
4
ответ дан 30 November 2019 в 10:19
поделиться

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

1
ответ дан 30 November 2019 в 10:19
поделиться

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

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

}

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

localVar = getFlashVars().sampleVar || "default.xml";
1
ответ дан 30 November 2019 в 10:19
поделиться