Сентябрь 2016

Python — многострочное комментирование в PyCharm

В языке Python не предусмотрено внутреннего синтаксиса для многострочного комментирования кода (наподобие /* … */ в других языках). Есть два варианта обхода этой проблемы:

  1. Использовать в качестве комментариев синтаксис многострочного литерала: ′′′

Минут данного метода в том, что подобный комментарий остается строковой константой и встраивается в конечный код.

  1. Если для написания кода используется IDE PyCharm можно выделить несколько строк и нажать комбинацию клавиш: Ctrl + /

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

Плагин к WordPress TinyMCE Advanced Editor — установка начального значения нумерованного списка

Небольшая доработка плагина к WordPress TinyMCE Advanced Editor. Дополнительная кнопка по клику позволяющая задавать начальное значение для нумерованного списка.
Собственно добавляет атрибут start = N к тегу OL.

Пример использования плагина
Пример использования плагина

Автоматическая установка фокуса на flash-приложение в браузере

При открытии html-страницы со встроенным flash-приложением фокус автоматически на приложение не устанавливается. В результате flash-приложение не реагирует на нажатия клавиш на клавиатуре, пока по нему не сделать клик мышкой.
Эту проблему можно обойти путем программной установки фокуса на flash-приложение при загрузке html-странички.

Переход с Adobe CS3 на FlashDevelop

FlashDevelop принято хвалить. Считается, что это лучшая на сегодня среда для разработки flash-приложений. На самом же деле серьезных причин перехода всего полторы:
1. Бесплатность. Если лицензия на CS3 принадлежит не вам, а предприятию, на котором вы работаете, или же вовсе вам не принадлежит: бесплатность — весомый довод в пользу перехода.
2. Вроде бы (догнав проект на CS3 до 300+ классов я еще не сталкивался с этой проблемой) компилятор CS3 не любит больших проектов, сбоит, ссылаясь на недостаток памяти.
На этом все. Все остальные причины, которые обычно превозносят (автокомплит, автоимпорт, подстветка, переходы по классам), охватывает одно определение: личное удобство. Все перечисленное — это удобство набивания кода. Обычно же в любом проекте 90% времени занимает не долбление по клавишам, а отладка, поиск ошибок и мучительные размышления «ЧЯДНТ?».
Мое личное мнение: если вы не столкнулись с проблемой платности среды или недостатка памяти компилятора, и вас все устраивает в работе в CS3 — заморачиваться с переходом на FlashDevelop не стоит.
Если же вы столкнулись с двумя перечисленными причинами, или просто хотите улучшить удобство работы с кодом, практические заметки о переносе рабочего проекта с CS3 на FlashDevelop:

Встраивание шрифта в Adobe Flash CS

В последних версиях Flash-плеера Adobe внес какие-то изменения в отображение системных шрифтов, в следствие которых, шрифтом по-умолчанию стал Arial (до этого был Times). Это бы еще ничего, но для системных шрифтов теперь постоянно включен режим сглаживания, из-за которого текст небольшой высоты (10-12) выглядит сильно смазанным.
Добиться приемлемой четкости шрифта через AntiAliasType.ADVANCED мне не удалось. Поэтому выход остался один — встроить шрифт в flash-приложение.
Проинспектировав «гугл» на предмет встраивания шрифтов, можно получить множество ссылок на встраивание шрифтов и абсолютно во всех это предлагается делать посредством [EMBED …]
Помучавшись некоторое время, я убедился, что в Adobe Flash этот метод не работает и директива [EMBED] им преспокойно игнорируется. Выходит, этот метод подходит для Flex-разработчиков,но никак не годится для работающих в Adobe Flash.

Однако метод встраивания шрифта в Adobe Flash достаточно прост. Шрифт нужно включить в библиотеку проекта и залинковать для использования в приложении.

О дрожании, или при чем здесь twips

Как реализовано движение объекта:
Есть алгоритм, вычисляющий положение объекта в зависимости от параметров и времени. Т.е. в любой момент времени, а точнее — каждую итерацию игрового цикла, положение объекта пересчитывается. Результата возвращается в глобальной системе координат (мировая система).
Соответственно, каждую итерацию игрового цикла происходит вызов процедуры перемещения объекта из координат предыдущей итерации в координаты итерации текущей.
Т.к. скорости движения отдельных объектов невелики, блоками происходит «пустой» вызов процедуры перемещения (когда координаты объекта в предыдущей итерации цикла равны координатам объекта в текущей итерации). Не оптимально, но разговор сейчас не об этом.
А о том, что в принципе перемещение из точки в туже самую точку не должно вызывать фактического перемещения. Процедура перемещения генерирует единичную матрицу, единичная матрица, умноженная на матрицу трансформации объекта, матрицу трансформации не меняет. Но…

Подключение компонентов из пакета fl.* в проект на ActionScript 3

В отличие от компонентов из пакета flash.*, которые подключатся в проект одной строчкой import, чтобы подключить компонент из пакета fl.* этого не достаточно.
Чтобы подключить компонент из пакета fl.*, например fl.controls.CheckBox нужно:
— Открыть головной *.fla файл проекта
— Открыть окно с компонентами: Меню — Window — Components
— Открыть окно с библиотеками проекта: Меню — Window — Library
— Перетащить нужный компонент (в примере CheckBox) из окна компонентов в окно библиотек
— Сохранить *.fla файл.
Теперь в проекте можно использовать компонент CheckBox обычным способом:

concatenatedmatrix не единичная

Простейший пример, который показывает, что concatenatedmatrix у спрайта, который не имеет parent’а, не является единичной:

Как создать класс по его текстовому имени

Если набор объектов в сцене описывается в XML-формате, а затем динамически генерируется в приложении — в общем случае описание сцены будет выглядеть, как нечто подобное:

XML-файл загружается в сцену через URLLoader и парсится стандартным обходом всего дерева:

Вращение спрайта вокруг произвольной точки

Собственно классическое решение задачи поворота спрайта на заданный угол вокруг произвольной точки (чаще всего его центра) путем матричных преобразований описана в куче литературы и интернет-источниках и звучит следующим образом: перенос спрайта таким образом, чтобы точка совпадал с точкой 0.0,0.0 , поворот на заданный угол, перенос обратно.
Функция RotateAroundAxis представляет реализацию данного метода (Axis — ось или точка, вокруг которой будет повернут спрайт, Angle — угол поворота):