вторник, декабря 23, 2008

Сокеты, политика безопасности и SmartFox

Наконец-то я вплотную столкнулся с вопросом безопасности.
А собственно, когда настало время выложить многопользовательскую игру под SmartFox, я столкнулся со следующей проблемой: игра лежит на некотором доменном имени (somegame.ru). Сокетное соединение к SmartFoxServer (XX.XX.XX.XX:9339) просто не проходит:
"Ошибка: Запрос ресурса на xmlsocket://XX.XX.XX.XX:9339 источника запроса из h_ttp://somegame.ru.../Name.swf отклонен из-за отсутствия разрешений в файле политики."
"*** Нарушение безопасности изолированной среды *** Подключение к XX.XX.XX.XX:9339 прервано – нет разрешения от h_ttp://somegame.ru.../Name.swf".
Причем, при локальном запуске всё работает превосходно.

Долго я рыл статьи, форумы по кроссдоменным проблемам, особенности политики безопасности сокетных соединений, нашел много полезного:
External data not accessible outside a Flash movie's domain - общепознавательная статейка.
Про crossdomain.xml и как продолжение -
Security policy. Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation. Поисследовал данные вопросы, ознакомился со статьей -
Setting up a socket policy file server.
Затем не обнаружив ничего подходящего, поискал аналогичные вопросы на ресурсе SmartFox:
bluebox problem, donot connect - имеют косвенное отношение к проблеме, но могут пригодиться.
Troubleshooting common runtime problems дает общее представление о проблемах связи и наводит на главную статью по теме:

Flash Security Policy guidelines.
После поверхностного ознакомления со статьей, у меня сразу закралось подозрение - я проверил файл конфигурации config.xml и в секции
PolicyAllowedDomains конечно же не обнаружил записи AllowedDomain, соответствующей нужного мне домена. Админы, включили какие угодно домены, но только не тот который мне был нужен.
Прописываем нужный домен, рестартуем сервер и мгновенно получаем соединение.
Проблема, к счастью, является простейшей. Получаем урок: прежде чем отчаиваться и глубоко вкапываться в интернет и документацию, хорошо для начала просто еще раз проверить конфигурацию сервера.

среда, декабря 17, 2008

Настройка стиля предзагрузчика Flex-приложения

Как-то я уже сталкивался с подобной задачей: Делаем прелоадер для Flex-приложения. Продолжение. AS3.
Сегодня мне просто нужно изменить стиль предзагрузчика - изменить цвет фона и панельки. Ничего дополнительно скриптовать просто не требуется.

Начнем с цвета фона - тут всё просто: В инете невооруженным взглядом по первой ссылке находим: Изменение цвета прелоадера flex приложения.
Ключевая строка: "на вкладке Flex Compiler дописать строку “-default-background-color #336699″ в Additional compiler arguments."

Хорошо бы теперь изменить внешний вид панельки. Точнее - хотя бы просто убрать надпись "Loading".
Поиски приводят нас в классу DownloadProgressBar. Собственно, в нем и находится всё управление нашей панелькой.
Ищем дальше. Это же наш старый знакомый! А настраивается он элементарно: всего в два действия. Или более углубленно: How to customize the standard Flex 2 loader.
Пробуем:

package display
{
import mx.preloaders.DownloadProgressBar;

public class CustomDownloadProgressBar extends DownloadProgressBar
{
public function CustomDownloadProgressBar()
{ super();
initializingLabel="Инициализация";
downloadingLabel="Загрузка";
}
}
}

* * *

<mx:application
preloader="display.CustomDownloadProgressBar"
>
. . .


Таким образом, мы заменили надписи меток.

Однако, скрыть совсем метку, используя showLabel=false; не получается. Так же не оказывают никакого влияния и все остальные параметры. Они корректно трейсятся, но не их изменение не влияет на внешний вид. По-видимому эти параметры задействуются в других случаях.

А вот MINIMUM_DISPLAY_TIME работает забавно - можно подольше подержать панель прелоадера на экране. Для тестов удобно. До этого, я перетаскивал во Flash CS и делал Simulate Download.

В общем, своей цели мы добились. На крайняк, можно просто установить initializingLabel=""; downloadingLabel="";. Кстати, извратиться и задать надписи с использованием HTML-разметки не получилось (строка выводится как есть).

вторник, декабря 16, 2008

Проблема отображения кириллицы в поле ввода при wmode="transparent"

Столкнулся со старинной проблемой Flash - Невозможность ввода кириллического текста при прозрачном фоне flash-объекта (wmode="transparent").

Пошуршав в Гугле, я выяснил:
Баг очень старый, решения его нет.
Или решения его достаточно сомнительны:
Ре-маппинг и хаки
Коррекция полученного от клавиатуры символа


В Adobe JIRA следующие упоминания этой проблемы:
Да что тут перечислять... Вот.

Кривые Безье. Подбираем движок. AS3

Передо мной стоит прозаичная задача - мини-редактор с использованием кривых Безье. Есть некая фигура, состоящая из кривых. Необходимо ее редактировать, путем изменении положения опорных точек.

Итак, прежде чем обратиться к таким авторитетным проектам как http://bezier.ru/, интересно было бы прогуляться по гуглу и посмотреть, что еще предлагают по этой теме.

Один из первых попавшихся - блог Paul Tondeur и его изыскания на эту тему: Drawing a cubic bezier curve using ActionScript3. Здесь можно ознакомиться с теоретической частью и изучить примерчик.

Дальше, получаем интересную статейку ссылкой с Drawlogic.com на labs.zeh.com.br: The search for the perfect bezier tweening syntax. Поиск решения создания пути перемещения при помощи кривых Безье. Особенно понравился пример с использованием Papervision3D - задается путь движения между фигурами.

Далее: Singularity представляет черезчур заумные классы с кучей примеров: Demos. Статья с описанием: AS 3 Parametric Curve Library.

Еще одна хорошая ссылочка: некий Cartogrammar представляет весьма доступный и очень простой в использовании класс CubicBezier.as. Здесь всего два статических метода, которые отрисовывают кривые разными способами. Кстати, очень даже заслуживает внимания. Пока ходил по ссылкам, натолкнулся на забавную демку как раз с использованием этого класса: AS3 Bezier blobs/metaballs

Интересный набор библиотек на Greensock: TweenLite, TweenMax, TweenFilterLite, TransformManager (AS3), TweenGroup. Не относится к кривым Безье (точнее их использует в некоторых случаях), но заставляет обратить на себя внимание.

Небольшое решение, которое может быть полезным: CurveToArray (AS3 class). На основании трех точек кривой Безье, выдает массив координат точек кривой.

Еще немного русскоязычного: Движение по кривой Безье.

А вот некий Flashgamer советует задвинуть "a couple good resources" и взяться все же за Degrafa. Ввиду "крупности" этого движка, оставим его на десерт.

Поглядим, таки, что нам предлагает наш http://bezier.ru/. Здесь множество документации на русском (что важно), обзорная демка и исходники. Скачать исходники можно при помощи SVN-клиента. - делаем СheckОut. Исходники по большей части представляют собой примеры использования, что конечно радует. В принципе писать тут нечего - сайт полон информации на русском, и если что, здесь же можно написать комментарий и получить ответ от хозяев. Надо просто попробовать.
Создаем проект AS3 в FD, кладем в него примеры, прописываем пути к библиотеке и компилируем. Ошибка: "Bezier.as(1488): col: 12 Error: Недопустимое присваивание переменной, которая определена как константа." Ну что ж делать, бывает. В строке "const limiter : Number = 20;" Меняем "const" на "var" и наслаждаемся демкой.
Кстати, исходный код просто перегружен ASDoc-комментариями (что, безусловно, является достоинством). Однако, ни на сайте, ни на Google Code я не смог найти ASDoc-документации Bezier. Странно...

Перейдем к Degrafa. Скачать ее можно на Google Code, но я, пожалуй, воспользуюсь SVN. Пришлось здорово повозиться, чтобы запустить примеры.
При использовании исходников, я вообще не смог избавиться от ошибок - что я не делал - везде вставала проблема некорректных namespace.
При использовании SWC, пример тоже выдавал кучу ошибок. Загвозка была в том, что в примерах указан namespace xmlns:degrafa="http://www.degrafa.com/2008", а нужно xmlns:degrafa="http://www.degrafa.com/2007".
Вывод по Degrafa - мощная и популярная система, но требует углубленного изучения.

Итак, вывод. Для себя я избрал три варианта:

  1. CubicBezier.as.
  2. Bezier.ru.
  3. Degrafa.

CubicBezier - вполне работоспособный, примитивный движок позволяющий рисовать кривые Безье с различными параметрами. Его можно сразу использовать "как есть", либо с необходимыми модификациями, которые внести совсем не сложно. Предварительного изучения не требует, для моей задачи подходит "на ура".
Bezier - Требует предварительного изучения, зато предоставляет широкий набор возможностей для решения большинства практических задач, связанных с кривыми Безье.
Degrafa - Мощный комплекс, позволяющий создавать графику декларативно, при помощи MXML. Для того, чтобы приступить к решению задачи, придется изрядно почитать документацию, которая имеется в изобилии, в формате ASDoc. За изучение есть смысл взяться, т.к. проект весьма перспективный и популяризирующийся. Однако, как всегда, под конец года времени нет, поэтому придется отложить. Но не надолго - ощутив вкус прелестей Degrafa, уже не хочется от него отказываться.