понедельник, 18 февраля 2008 г.

Трансформация объекта относительно произвольной точки

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

package com.dmitrykrasnov.research {
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.geom.Matrix;
    import flash.geom.Point;

    public class TransformationAboutPoint extends Sprite {
        public function TransformationAboutPoint() {

            // Для примера, нарисуем квадрат.
            var myBox : Shape = new Shape();
            myBox.graphics.lineStyle(1, 0x000000);
            myBox.graphics.beginFill(0x000000);
            myBox.graphics.drawRect(16, 16, 32, 32);
            myBox.graphics.endFill();

            // Возьмем его матрицу трансформации и повернем ее на 45 градусов.
            // Заметьте, поворот произойдет относительно начала координат.
            var myMatrix : Matrix = myBox.transform.matrix;
            myMatrix.rotate(Math.PI / 4);

            // Выберем точку вращения (пусть это будет центр нашего квадрата).
            var axisPoint : Point = new Point(32, 32);

            // Выясним, куда она сместилась в результате поворота.
            var newPoint : Point = myMatrix.transformPoint(axisPoint);

            // Вычислим относительное смещение.
            var deltaX : Number = axisPoint.x - newPoint.x;
            var deltaY : Number = axisPoint.y - newPoint.y;

            // Компенсируем относительное смещение.
            myMatrix.translate(deltaX, deltaY);

            // Применим трансформации к нашему квадрату.
            myBox.transform.matrix = myMatrix;

            // Посмотрим на результат.
            addChild(myBox);

            // На всякий случай, нарисуем проверочные направляющие.
            var guideLines : Shape = new Shape();
            guideLines.graphics.lineStyle(1, 0xFF0000);
            guideLines.graphics.moveTo(0, axisPoint.y);
            guideLines.graphics.lineTo(64, axisPoint.y);
            guideLines.graphics.moveTo(axisPoint.x, 0);
            guideLines.graphics.lineTo(axisPoint.x, 64);
            addChild(guideLines);
        }
    }
}

Если кому-то известно более изящное решение, пожалуйста, опишите его в комментариях.

воскресенье, 17 февраля 2008 г.

Впечатления от 3-й встречи RAFPUG

Сегодня я посетил 3-ю встречу RAFPUG, которая проходила в московском офисе Adobe. Так что спешу поделиться впечатлениями от этого мероприятия. Они, скажу сразу, не особо положительные, но уж какие есть.

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

Первым в программе встречи был анонс конкурса Russian Flash Awards, в ходе которого был продемонстрирован видеоролик, смонтированный из работ участников конкурса прошлого года. Все бы ничего, только впечатление портило то, что многие работы были вставлены в ролик вместе с окном браузера, в котором они работали. На мой взгляд - это не профессионально.

Далее был катастрофически занудный доклад Александра Козловского в котором он пытался продемонстрировать построение несложного AIR-приложения с использованием Papervision3D. Не знаю, сколько он готовился к этому докладу, но в процессе, то и дело случались какие-то заминки и сбои, что приводило к частым длительным паузам, во время которых скучающая аудитория была вынуждена наблюдать судорожные метания Александра в попытках сделать хоть что-нибудь. Сути и общих принципов в этом докладе было минут на 5, а хоть сколько-нибудь вдохновляющего результата я вообще не увидел, если не считать 3-х тормозных кубиков, которые предлагалось использовать в качестве меню. В общем, во время этого безобразия я постоянно клевал носом, а под конец и вовсе задремал и чуть не упал с кресла. Положение спасал только Артемий Малков (если я не ошибаюсь), который периодически коротко объяснял суть того, что в данный момент происходило или, по крайней мере, должно было происходить.

Вдохновенность Артемия Малкова, который во время "Hands-on" повествовал о layout-ах и binding-ах, могла бы, как минимум, удивить человека, хотя бы раз видевшего Delphi. Ну а я лишь невесело усмехнулся, встал и ушел.

суббота, 16 февраля 2008 г.

computeSpectrum - двигатель всего

Вдохновившись алхимическими опытами Татьяны Белой (огромное ей спасибо) и перекопав некоторое количество документации, я создал это:

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

PS: Градиенты в AS3 меня не обрадовали - излишняя сложность и дефицит возможностей. Вот если бы, скажем, можно было строить градиент вдоль кривой...

понедельник, 4 февраля 2008 г.

MODx - серверная составляющая Flash-сайта

MODx - функциональная, расширяемая и удобная система управления сайтом (Content Management System, CMS), свободно распространяемая по лицензии GNU GPL. Сами разработчики позиционируют ее даже как систему разработки сайтов (Content Management Framework , CMF).

Почему MODx кажется мне удачной серверной составляющей Flash-сайтов? Поясню по пунктам:

  • Система разработана на языке PHP и для хранения данных использует СУБД MySQL. Это значит, не возникнет проблем с выбором хостинга.
  • Гибкая система плагинов, сниппетов, шаблонов и чанков позволяет выводить документы практически в любом формате. Не является исключением и XML-формат, удобный для обмена данными с Flash. К примеру, можно получить XML, содержащий информацию об актуальной структуре сайта и использовать его при формировании навигационного меню. Или получите XML со списком графических файлов в папке и организуйте, легко обновляемую, галерею. И это лишь часть возможностей.
  • Инструменты MODx позволяют легко и быстро создать HTML-версию сайта, обновление которой будет происходить автоматически и синхронно с Flash-версией. Таким образом, можно решить проблему поисковой индексации и угодить пользователям не желающим (или не имеющим возможности) установить Flash-плеер.
  • Простая установка и настройка. Не менее простое сопровождение и расширение. И все это не требует каких-то особых навыков. Ну а если вы хорошо разбираетесь в PHP, то сможете творить чудеса.

Есть у MODx и недостаток - падение производительности при росте числа документов. Это становится заметно, когда количество документов приближается к 5000. Но такое количество документов свойственно крупным и очень крупным проектам.

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

Информации о MODx в интернете довольно много, даже на русском языке. Достаточно воспользоваться Яndex по слову "MODx". А официальный сайт находится по адресу: modxcms.com

суббота, 2 февраля 2008 г.

Управления компиляцией и доступ к SWC-библиотекам в FDT

Недавно я взялся за изучение Flash-платформы: почитал документацию, форумы, блоги, поковырялся в Adobe Flash CS3 Professional, собрал пару элементарных программ на AS3, для общего понимания - и как-то не понравился мне Flash.

Ну, во-первых, как рабочая среда для программиста, он (Flash) ужасен. Я когда-то давно (лет 5-7 назад) программировал на Java. Так вот, после VisualAge и JBuilder, во Flash нельзя работать, можно только сидеть и горько плакать.

Во-вторых, меня очень смутило так называемое единство графики и кода. Конечно если ты сам себе программист, дизайнер, архитектор и, заодно, начальник, то такая "единая среда" вполне удобна. Но серьезные задачи, при такой постановке дел, решать невозможно.

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

Я решил облегчить себе жизнь и не анализировать весь спектр существующих интегрированных сред, а руководствоваться при выборе IDE мнением компетентных людей. Как оказалось, выбор был, в общем-то, невелик:

  • Powerflasher FDT - удобная и функциональная среда разработки, представляющая собой плагин к Eclipse.
  • FlashDevelop - бесплатный open source продукт. По отзывам и доступной документации, выглядит слабее FDT.

Вопрос оплаты для меня не стоял, открытый исходный код мне без надобности, так что проблема выбора меня не мучила, FDT показался мне наиболее удачным вариантом.

Установка Eclipse и FDT особых проблем не вызвала. Прочтение FDT - User Guide / Getting Started / Basic AS3 tutorial дало мне возможность в 2-3 клика интегрировать Flex 3 SDK Beta 3 в FDT, создать проект, написать простой класс и запустить его.

Восторгу не было предела. Да, я могу программировать, компилировать и запускать Flash-приложения! Но как мне управлять компиляцией? Как управлять шириной, высотой, фреймрейтом и параметрами безопасности конечного SWF-файла?

С этим вопросом я обратился на "Flasher.ru", где уважаемый господин etc сильно озадачил меня, посоветовав подружить Flex SDK с FDT через Ant. Беглого просмотра документации по Ant хватило мне для того, чтобы ужаснуться до глубины души. Дело в том, что Ant - платформонезависимый аналог UNIX-утилиты make. Из опыта работы с ОС Linux я знаю, что make - мощный, удобный, но весьма сложный инструмент, на освоение которого может уйти какое-то время. Использование такого инструмента при сборке простых проектов - неоправданно и сравнимо с установкой и использованием в таких случаях сервера CVS или Subversion. Написать "Hello World", сохранить его в CVS и собрать с помощью Ant - абсурд, не так ли? Конечно, Ant и Subversion нужно изучить, но не на этом этапе, а чуть позже.

Немного поразмыслив, я решил найти более простой способ управления компиляцией, эмпирически изучая FDT. И нашел. Оказалось, что если кликнуть ПКМ по файлу класса в проекте и выбрать Run (или Debug) As / Open Run (или Debug) Dialog, а затем перейти к FDT AS3 Application / [файл класса], то на вкладке Compiler Arguments можно обнаружить поле Arguments, содержащую строку опций компилятора mxmlc. Редактируя эту строку, можно довольно гибко управлять компиляцией конечного SWF-файла. Разумеется, описание опций компилятора mxmlc можно найти в Adobe LiveDocs.

Казалось, счастье есть и можно с наслаждением предаваться программированию, ан нет. Flash - это графика, много графики, очень много графики. Ну не рисовать же все это самому программными средствами? Для этого есть дизайнеры. Flash CS3, как инструмент, будет им в самый раз. В идеале хотелось, чтобы дизайнер, создавая во Flash CS3 необходимый графический контент, имел возможность, в конечном счете, предоставить мне некий ресурс, из которого я мог бы брать графические элементы и использовать их в коде своего проекта под FDT.

Глядя на мою неудовлетворенность, многоуважаемый господин etc посоветовал мне посмотреть документацию по Flex SDK и метатегу Embed. И я посмотрел. Не буду сейчас описывать, как много нового я узнал, т.к. большую часть из этого я не понял. Главное, что я понял - ненужно разбираться с embedding-ом на третий день изучения Flash-платформы.

После некоторых теоретических рассуждений и пары-тройки экспериментов я выяснил следующее:

  • Дизайнер должен создавать графический контент, оформляя отдельные его элементы в символы и компилируя наборы символов в SWC-библиотеку.
  • В папке проекта следует (так, для порядка) создать папку lib и поместить туда SWC-библиотеку, предоставленную дизайнером.
  • В FDT в окне Flash Explorer, нужно кликнуть ПКМ по файлу SWC-библиотеки и выбрать Source Folder / Add to Classpath.

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

PS: Я так и не понял чем руководствовался премногоуважаемый господин etc давая мне такие своеобразные советы. Видимо, мудрость его так велика, что я не в состоянии постичь его помыслов. Тем не менее, его советы все же помогали мне ориентироваться в информационном пространстве, за что я безмерно ему благодарен. Надеюсь, он простит мне некоторую иронию в его адрес.