Category: Flash

Обнаружена критическая уязвимость в Flash Player 10

Обнаружена критическая уязвимость в Flash Player 10.0.12.36.
Идем сюда. И исправляем проблему, чтобы не попасть под раздачу огненных слонов.

 

Как не надо делать. Никогда.

Сегодня занимался доработкой чужого старого кода (Flash/AS2). Долго не мог понять, где выставляется значение одного флага.
В наши дни если весь твой AS-код не инкапсулирован в классы, вынесенные в отдельные внешние AS-файлы, то бьют ногами. Понятно, никто уже и не помнит о том, что когда-то можно было размещать код прямо в символах, в их ключевых кадрах. Но я нашел такой код именно там. И выглядел он вот так:

this._parent.arrow_min.nextFrame();
this._parent._parent._parent.timer- -;
this._parent._parent.timer.text = this._parent._parent._parent.timer;
if(this._parent._parent._parent.timer <= 0) {
    this._parent._parent._parent.gameOver = true;
    stop();
}

А все кричат: "Индусы! Индусы!"… эх…

Глюк Flash ActionScript с методом setTimeout()

Сегодня потерял минут 20, пытаясь понять почему “не едут лыжи”.
Решения так и не нашел. Гугл также по этому поводу молчит.

Итак, код FLA-файла (ActionScript 2.0), в первом кадре:

import foo;
var foo1 = new foo();

Код внешнего файла foo.as:

class foo {

    function foo() {
        setTimeout(this.bar, 1000);
    }

    function bar() {
        trace(‘foo.bar called’);
    }
}

Думаете, это работает? Хрена-с два! Компилятор выдает ошибку:
foo.as, Line 4 / There is no method with the name ‘setTimeout’. / setTimeout(this.bar, 1000);

Почему-то компилятор, вместо того, чтбы найти имя “setTimeout” в списке глобальных функций, упорно считает, что я пытаюсь сделать вызов this.setTimeout().

Что примечательно, если использовать setInterval() вместо setTimeout(), то все прекрасно работает.
Также, если писать plain-код, без использования класса – все также прекрасно работает (и с setTimeout()).

Подпереть можно вот так:

class foo {

    function foo() {
        with (this) {
            setTimeout(this.bar, 1000);
        }
}

    function bar() {
        trace(‘foo.bar called’);
    }
}

Тогда все работает.

Эй, флэшеры? Есть мысли? Это баг флэша или я сегодня просто мало поспал?

P.S.: пришлось тупо подпереть с помощью with.

Hush City

Hush City (умолкший город (мой вольный перевод)). Так называется новый интересный проект, созданный белорусскими вольными художниками.

Байнет уже гудит. Аська ломится от ссылки. Кому не отправь ее, от каждого уже услышишь в ответ “язычковый клавишно-пневматический музыкальный инструмент с мехами и двумя кнопочными клавиатурами” (баян, то бишь).
Лирику оставлю каждому воспринимать по-своему, ибо это все очень личное. Одна знакомая, возразила мне, то это не драма, а “…история про блондинку, которая продалась янки”. Здесь я лишь немного порассуждаю про общую ценность проекта.

Итак, из плюсов:
- отличные фотографии Минска и людей на его фоне и просто;
- прекрасная музыка и звуковые эффекты;
- не местного качества (читай – “отличного”) качества дизайн сайта (aka “веб-дизайн”);
- профессиональная HTML-верстка (оно и понятно, ведь Rygorka приложил к этом свою Strict-верстающую лапу ;)
- приятный Flash.

На Flash остановлюсь подробнее, как на моем профессиональном занятии:
- превосходная проработка анимационных эффектов, призванных превратить фотографии в видеоряд. Это удалось на все 100%;
- отличные символы (такси просто порвало мозг – молодцы!). Также зацепила символика листьев, пролетающих то тут, то там и идея визуализации обмена SMS-ками;
- красивые отображения и сокрытия фотографий – есть очень приятные решения.

Из минусов:
- видеоряд просто ломится от эффектов мигания; да, они хороши, но здесь немного переборщили. Есть такие моменты, когда просто устаешь от мигания. Зачастую достаточно было бы простого поверхностного эффекта потертой пленки или игры цветом, либо каким-то плоскоцветным символом;
- затасканность некоторых анимационных подходов и эффектов, которые были свежачком еще года 4-5 назад. Но это был свежак у буржуев, так сказать, на гребне волны дизайна подобных проектов. Так что этот минус вовсе не минус, а отражении тенденций;
- отсутствие русскоязычной версии. Да, читал в концепте, что английский выбран как способ донести проект до как можно большей аудитории. Отлично. Но почему бы не сделать еще и версию на русском? Ведь это совершенно не сложно.

В целом проект получился просто замечательный. Романтично, ярко, вкусно и на уровне, совершенно выдающемся для байнета.

Только вот эпилог некий сложный. Текста нет. Только небо. Черно-белое и голубое. Если мысль была “Жизнь не остановилась. И небо опять станет голубым.”, то я все понял. Если нет, то подскажите мне, пжлста.

Каждый раз, кода вижу подобный проект, меня слегка наполняет белая профессиональная зависть – почему я не приложил к этому руку? Почему, даже зная некоторых участников этого проекта, я не оказался в команде? Ах, ну да… время, деньги, проекты. Вечная занятость.
А ведь это еще один плюс в копилку авторов этого проекта: ребята нашли время для самовыражения, для вольного некоммерческого творчества и сделали прекрасную вещь. Такие проекты наполняют Интернет. Именно наполняют, а не набивают.

P.S.: почему-то вспомнился один старенький проект.

MMO для детей

Многопользовательская развивающая игра для детей 4-7 лет - Driving Kids
Сегодня я начинаю серию (надеюсь, что это будет серия ;) статей на тему разработки MMO.

Связано это исключительно с моей работой в проекте по созданию многопользовательской онлайн обучающей игры для детей 4-7 лет.
В основном, статьи будут ориентированы на Flash-разработчиков, кое-где будет уделено внимание серверным скриптам и базам данных.

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

Сразу хочу оговориться, что над проектом работаю не я один, а целая команда. Моя роль – архитектор проекта, с сильным уклоном в техническую часть + девелопмент движка.

Итак.

Проект называется Driving Kids (DK) и, фактически, представляет из себя многопользовательскую онлайн игру для детей в возрасте 4-7 лет. Основные акценты сделаны на обучении, развлечении и безопасности общения детей.

Проект разрабатывается с использованием стандартного набора для web-платформы:

PHP
MySQL (возможно, будет заменена на PostgreSQL)
Flash (AS 2.0 – да, третий ActionScript рулит, но в этом проекте есть специфика, о которой расскажу как-нибудь позже)

Для реализации игрового сервера, обрабатывающего сокетные соединения и реализующего обмен сообщениями, используется SmartFox Server PRO (не изобретать же велосипед, верно? ;-)

Вчера была запущена публичная демо-версия игрового мира.
Конечно, там пока пусто, но приятно видеть, как потихоньку начинает распухать таблица пользователей в базе данных ;)

Собственно, ссылка на проект: www.drivingkids.com

История одной досадной ошибки

Недавно наступл на грабли при разработке приложения в Adobe Flash. Спешу поделиться опытом.

Сделал во флэше алгоритм контроля коллизий объекта с многоугольниками, заданными вершинами в виде массива точек. Т.е. без использования мувиклипов и, соответственно, MovieClip.hitTest(). Все работает прекрасно. Но. С одним “но”:

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

Долго чесал репу, оптимизировал движение, тестировал. По итогу пришел к одному простому выводу: Flash жестко округляет координаты объектов на сцене с точностью до 0.5, т.е., фактически, до половины пикселя.

Следующий пример дает хоршее представление о том, что происходит:

this.createEmptyMovieClip('foo', this.getNextHighestDepth());

for (var i = 0; i < 20; i++) {
    foo._x = i/100;
    trace(( i/100) + ” – ” + foo._x);
}

Вывод:

0 – 0
0.01 – 0
0.02 – 0
0.03 – 0
0.04 – 0
0.05 – 0.05
0.06 – 0.05
0.07 – 0.05
0.08 – 0.05
0.09 – 0.05
0.1 – 0.1
0.11 – 0.1
0.12 – 0.1
0.13 – 0.1
0.14 – 0.1
0.15 – 0.15
0.16 – 0.15
0.17 – 0.15
0.18 – 0.15
0.19 – 0.15Что и следовало доказать – округление.

Решение: в случае, если необходимо иметь точные значения координат объекта, не полагайтесь на свойства объекта – заведите собственные свойства (например, px для _x и py – для _y) и храните актуальные значения в них.

Flash ActionScript и сортировка массивов

Сегодня возникла необходимость быстрой сортировки массива в программе на ActionScript. Естественно, руки потянулись использовать стандартный Array.sort(), особенно, учитывая то, что по результатам сортировки массива мне необходимо сделать соответствующие перестановки MovieClip’ов по уровням z-индексирования, т.к. Array.sort() поддерживает пользовательскую функцию сравнения элементов.

Из-за природного недоверия решил сделать небольшой тест для встроенной функции сортировки класса Array. Результаты удивили. Оказалось, что стандартный метод использует пузырьковую сортировку. Печально. Ну да ладно. Пришлось сделать быструю сортировку (quick sort).

Continue reading »