четверг, 31 марта 2011 г.

Как добавить практически любой шрифт в ваш Flash-проект - бесплатная утилита от MotoCMS

Как добавить практически любой шрифт в ваш Flash-проект - бесплатная утилита от MotoCMS:

Пишет Николай Внимательный:

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

Font embedding

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

Продолжение - Как добавить практически любой шрифт в ваш Flash-проект [...]

Быстрое внедрение шрифтов [Embed]

Быстрое внедрение шрифтов [Embed]:

Уже ни раз писалось о встраивании шрифтов, поэтому я не буду описывать весь процесс а покажу лишь простой и удобный прием на примере кода.

package assets {
 import flash.display.Sprite;
 import flash.system.Security;
 import flash.text.Font;
 import flash.utils.describeType;
 
 public class FontsAsset extends Sprite {
  [Embed(source="../../../res/fonts/MyriadPro-Semibold.otf", mimeType="application/x-font-truetype", fontName="MyriadSemibold", unicodeRange="U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E,U+02C6,U+02DC,U+2013-U+2014,U+2018-U+201A,U+201C-U+201E,U+2020-U+2022,U+2026,U+2030,U+2039-U+203A,U+20AC,U+2122,U+0401,U+0410-U+044F", embedAsCFF="false")]
  // Uppercase [A..Z] ; Lowercase [a..z] ; Numerals [0..9] ; Punctuation [!@#%...] ; Basic Latin ; chars="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
  public static var MyriadSemibold : Class;
 
  [Embed(source="../../../res/fonts/MyriadPro-Regular.otf", mimeType="application/x-font-truetype", fontName="MyriadRegular", unicodeRange="U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E,U+02C6,U+02DC,U+2013-U+2014,U+2018-U+201A,U+201C-U+201E,U+2020-U+2022,U+2026,U+2030,U+2039-U+203A,U+20AC,U+2122,U+0401,U+0410-U+044F", embedAsCFF="false")]
  // Uppercase [A..Z] ; Lowercase [a..z] ; Numerals [0..9] ; Punctuation [!@#%...] ; Basic Latin ; chars="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
  public static var MyriadRegular : Class;
 
  public function FontsAsset() {
   Security.allowDomain("*");
   var xml : XML = describeType(this);
   for (var i : uint = 0; i < XMLList(xml["variable"]).length(); i++) {
    Font.registerFont(this[XMLList(xml["variable"])[i].@name]);
   }
  }
 }
}

Собственно встроить шрифтов можно сколько угодно, в коде ничего менять не придется кроме добавления строк описывающих само встраивание.
Чтобы шрифты отображались в самом приложении достаточно будет в конструкторе создать новый экземпляр FontsAsset.

new FontsAsset();

Конечно не стоит забывать о использовании textField.embedFonts.

[...]

среда, 30 марта 2011 г.

ВКонтакте и бонусы за приглашенных друзей

ВКонтакте и бонусы за приглашенных друзей:

Достаточно часто вижу жалобы разработчиков, на тему запрета от ВКонтакте поощрений за приглашения друзей, и поэтому решил написать эту заметку.

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

  1. определенные игровые итемы можно получить только от друзей
  2. друзья раз в сутки могут присылать итемы которые дают энергию (или её аналог)
  3. друзей можно нанимать в качестве помощников, что будет приносить бонусы

и т.д.

Все эти способы не противоречат правилам.

Режимы подкреплений

Режимы подкреплений:

Mario и монеткиТема использования режимов подкреплений в играх впервые была поднята в докладе “Behavioral Game Design” десять лет назад. Когда я прочитал статью, основанную на докладе, это был для меня шок. Я стал анализировать игры с точки зрения бихевиоризма, обратил свое внимание на доступную психологическую литературу и начал экспериментировать с наградами в своих играх.

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


Немного напомню

Подкрепление – это мгновенная, приятная для игрока реакция игры на его действия. Подкрепления служат для того, чтобы увеличивать частоту и количество повторений определенных действий.

Если для вас это звучит немного заумно, прочитайте сначала предыдущую статью: “Кнут и пряник”. В ней детально описаны два вида подкреплений с примерами. А если неохота читать, то просто для упрощения будем считать, что подкрепление – это что-то приятное для игрока, которое появляется сразу же после выполнения им какого-то действия.

 

Режимы подкреплений

Люди (и животные в целом) подстраивают свое поведение под тип подкреплений. Например, если экзамены нужно сдавать раз в полгода, многие студенты начнут прикладывать усилия только ближе к экзаменам. Другими словами, вероятность того, что средний студент будет прилежно учиться в середине семестра – мала.

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

Зато если преподаватель решит проводить контрольные в случайные дни, многие будут готовиться постоянно – ведь неизвестно, когда следующая контрольная: завтра или через неделю. Другими словами, вероятность того, что студенты будут более часто готовиться – самая высокая из этих трех ситуаций.

Все это время преподаватель менял режим подкреплений: правило, устанавливающее вероятность, с которой подкрепление будет происходить. Существует много подобных режимов, но все их можно классифицировать по двум основным параметрам:

  1. время
  2. количество действий

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

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

Will press lever for food
“Буду нажимать рычажок за еду”

В зависимости от этих двух параметров выделяют четыре базовых режима подкрепления, на которых строятся все остальные:

  • Режим подкрепления с постоянным соотношением
  • Режим подкрепления с постоянным интервалом
  • Режим подкрепления с вариативным соотношением
  • Режим подкрепления с вариативным интервалом

 

Режим подкрепления

с постоянным соотношением

[...]

Антон Волков о прошлом, настоящем и будущем

Антон Волков о прошлом, настоящем и будущем:

Информационный портал Prosto-site.org умудрился разговорить технического директора AlternativaPlatform Антона Волкова так, что новое о нём открыли даже давние его знакомые. Рассказ о прошлом, настоящем и будущем “Альтернативы” из уст одного из её основателей читайте в этом интервью.

a_volkov_interview.jpg

воскресенье, 27 марта 2011 г.

TowerDefence #8. Первая башня

TowerDefence #8. Первая башня:

Сегодня мы наконец-то добавим в нашу игру долгожданные башенки и научим их стрелять и убивать врагов. Но для этого прийдется много поработать [...]

пятница, 25 марта 2011 г.

вторник, 22 марта 2011 г.

Биндинг в ActionScript проектах. Часть 2

Биндинг в ActionScript проектах. Часть 2:

Рамки использования метатега [Bindable] значительно шире указнных в статье Биндинг в ActionScript проектах. Часть 1. В данной статье расскажу о том куда можно применить данный метатег и о возможностях биндинга в случае использования собственных событий.

Куда можно воткнуть метатег [Bindable]?

Метатег [Bindable] можно использовать в следующих местах:

1. Перед свойством.

Свойство может быть как public, так и protected или private.

Например:

1
2
[Bindable]
public var text:String;

О биндинге применительно к свойствам уже говорилось в первой части. Компилятор автоматически преобразует свойство, помеченное тегом [Bindable] к геттеру/сеттеру с отсылкой события.

2. Перед определением класса

1
2
[Bindable]
public class SomeClass extends EventDispatcher

Это равносильно тому, что мы бы проставили метатег [Bindable] для каждого из public свойств этого класса. Private и protected или свойства из другого пространства имен автоматически не будут помечены как [Bindable]. Если нужно забиндить не public свойства к ним нужно дописывать метатег [Bindable] самостоятельно.

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

3. Перед get или set методом

Метатег [Bindable] так же можно использовать если свойства у класса оформленны в виде get/set методов:

1
2
3
4
5
6
7
8
private var _text:String;
[Bindable]
public function get text():String{
    return _text;
}
public function set text(value:String):void{
    _text = value;
}

Компилятор позволит вам поставить его как возле геттера, так и возле сеттера. Но! Как изветсно если мы для свойства напишем только сеттер то оно будет доступно только для записи (write only), если же напишем только геттер то только для чтения (read only). С помощью BindingUtils “забиндиться” на свойство доступное только для записи невозможно, но сделать это для свойства, доступного только для чтения – вполне.  Я настоятельно рекомендую всегда писать тег [Bindable] только рядом с геттером, это позволит видеть событие (см. ниже) и избежать путаницы и ошибок.

Если указан только геттер и свойство доступно только для чтения, целесообразно использовать биндинг только совместно с событиями (см. раздел “Кастомные события”), иначе биндинг сработает только во время инициализации, а среда разработки будет выдавать предупреждения.

4. Перед методом

1
2
3
4
5
[Bindable(event="bindFunctionChange")]
public function bindFunction(prop:int):String{
    ...
    return someString;
}

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

Кастомные события

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

Итак о событиях. Рассмотрим их при использовании с геттером. Представим что нам необходимо задать в каких конкретно случаях будет срабатывать биндинг, или чтобы он сработал после того как мы выполним все необходимые оперции в сеттере. Для этого в нашем метатеге мы можем указать событие в результате которого сработает биндинг [...]

понедельник, 21 марта 2011 г.

OpenZoom SDK

OpenZoom SDK:

OpenZoom SDK создана для отображения высококачественных изображений в Интернете, с помощью пирамид изображений. Она предоставляет достаточный инструментарий для отображения и управления отображением изображений и карт. У библиотеки хорошая справка, примеры и комьюнити, поэтому ограничусь лишь поверхностным описанием, просто, чтоб вы знали, что это уже реализовано и 'не надо париться'. SDK имеет две версии – для [...]

воскресенье, 20 марта 2011 г.

Введение в векторы

Введение в векторы:

Данной статьей я хочу начать небольшой цикл по возможному использованию векторов, а также освежить Ваши знания по данному предмету. Под вектором здесь я понимаю не «векторную графику», а Вектор – в смысле НАПРАВЛЕННЫЙ ОТРЕЗОК (надеюсь, что Вы сами поймете, почему я написал «Вектор» с большой буквы). В основном мы будем рассматривать векторы на плоскости, но будут и небольшие дополнения по предмету о векторах в пространстве.
Для чего же нужны векторы вообще? Отвечаем: с помощью векторов очень удобно задавать положение тел на плоскости и в пространстве, их скорости и ускорения (т.к. они, по сути, являются векторными величинами), всевозможные силовые факторы (гравитация, силы упругости, трения и т.д.). Иными словами, с их помощью можно создавать различные механические модели. Но на этом применение векторов не ограничивается, они используются и в трехмерной графике (например, для модели освещенности поверхностей, расположенных под различными углами к источнику света).
Заинтересованы? Как же столь простая вещь, как простой отрезок, может дать нам такие возможности? Что ж, давайте начнем путешествие в мир Вектора!

Рис.1. Вектор на плоскости

Математически вектор на плоскости может быть выражен парой чисел, причем несколькими способами:
1) полярный способ задания следует из определения вектора: первое число – его длина (т.е. расстояние между концом и началом вектора), второе – угол, который он образует с некоторой осью отсчета (на рис.1 такой осью является ось Ох). Данный способ мы будем использовать крайне редко (если вообще будем);
2) более распространенным является координатный способ задания вектора:
Взаимосвязи между длиной вектора, его углом на плоскости и координатами могут быть выражены следующими зависимостями:
Как видно, зная любые две характеристика вектора, мы можем найти остальные.
Теперь рассмотрим основные операции с векторами:
1) Умножение вектора на число

Рис.2. Умножение вектора на число (k>1)
Результатом умножения вектора AB на число k (масштабирование вектора) является вектор АС с координатами:

Таким образом:
- умножение вектора на k =1  оставит вектор без изменений;
- умножение вектора на k =0 превратит его в точку;
- умножение вектора на k =(-1) изменит его направление на противоположное;
- умножение вектора на |k| >1 увеличит его длину;
- умножение вектора на |k| <1 уменьшит его длину.

2) Нормализация вектора (приведение к единичному виду) [...]

четверг, 17 марта 2011 г.

Байты каждый день

Байты каждый день:

Представляю вашему вниманию перевод главы «Chapter 2 – Everyday bytes» (PDF) из книги «What can you do with bytes ?»

В предыдущей главе мы рассмотрели важные концепции управления двоичными данными в Flash Player. Настало время использовать эти концепции на практике в реальных проектах. Мы увидим как с помощью нашего лучшего друга – API класса ByteArray можно осуществлять внедрение двоичных ресурсов, управление звуком, парсинг SWF и т.д. – все то, что было недоступно прежде в ActionScript.

Мы продолжим наше путешествие в ByteArray, рассматривая различные примеры его применения, с которыми вы можете сталкиваться каждый день во время работы с Flash.

Содержание:
- Копирование объектов
- Сериализация/десериализация пользовательских объектов
- Внедрение ресурсов
- Внедрение байтов
- Прогрессивная загрузка изображений
- Компрессия/декомпрессия данных
- Генерация файлов изображений (PNG или JPEG)
- Сохранение двоичного потока с помощью удаленного сервера
- Сохранение двоичного потока локально
- Генерация PDF
- От байтов к звуку
- Парсинг двоичных данных (на примере SWF)

Копирование объектов

Одно из наиболее частых применений класса ByteArray – дублирование объектов. Вспомним, что AMF сериализация и десериализация доступна посредством интерфейса класса ByteArray. Метод writeObject это то, что нам нужно [...]

MultibyteStream – запись и чтение информации побитово

MultibyteStream – запись и чтение информации побитово:

На одном из UAFPUG’ов я коротко рассказал и показал этот проект, созданный в качестве 'proof of concept'. Проект позволяет сохранять данные динамической длины, используя бит, как единицу данных. Даёт возможность самому контролировать количество бит отводимых под хранение конкретных значений. Когда вы сохраняете данные, то всегда используете чётко определённые правила хранения информации. К примеру, для сохранения целочисленных значений используется всегда 8/16/32 бита, а для дробных(рациональных чисел) – 32 или 64 бита и т.д. Данный проект позволяет изменять эти правила в свою пользу и, таким образом, уменьшать количество данных, требуемых для сохранения значений. Так же, при сохранении данных, вы избавляетесь ссылок и контекстов, что приводит к ещё большей экономии бит/байт требуемых для хранения информации. Но это является и недостатком, т.к. требует строгого описания протокола хранения информации.

Для большего понимания, можно сравнить посмотреть на формат хранения данных JSON [...]

среда, 16 марта 2011 г.

ExternalInterface + IE = memory leaks. Workaround

ExternalInterface + IE = memory leaks. Workaround:

Пишет Александр Козловский:

Interlude

Как известно, ExternalInterface + IE любой версии порождает совершенно адские утечки памяти. Течёт именно JS. Не буду приводить результаты трёх бесконечных дней тестирования и сами тесты, поверьте наслово: течёт js-метод, добавляемый на страницу Flash Player'ом при каждой инициализации Flash-приложения, позволяющий вызывать со страницы методы, 'раcшаренные' во Flash-приложении с помощью ExternalInterface.addCallback().

А само решение в коде - под катом [...]

вторник, 15 марта 2011 г.

Minipodcast. Часть 1 -- общение флэш клиента с Erlang сервером.

Minipodcast. Часть 1 -- общение флэш клиента с Erlang сервером.:

Tags:

Intro

Задумал я тут мелкий проект -- помесь миниблога с подкастом -- миниподкаст. Зачем? Erlang пощупать, да скринкасты записать :) Ну и потом запустить это на своем сайте, чтобы доставать народ не только своей занудной писаниной, но и своим занудным голосом.

Технически все просто -- флэш клиент (audio recorder) соединяется с erlyvideo, захватывает микрофон и публикует аудиопоток. Erlyvideo сохраняет это дело в flv файл.

Затем флэш клиент соединяется с Erlang сервером (пока отдельный сервер, потом, может быть, это будет плагин к erlyvideo), и просит его сохранить инфу о записи (id, name, description, creation date и т.д.). Сервер сохраняет это дело в базе данных Mnesia.

Затем другой флэш клиент (minipodcast player) соединяется с Erlang сервером, получает список записей, отображает их. Для прослушивания записи соединяется с erlyvideo и получает flv файл.

Ну и все.

Работу над сим несложным проектом я решил осветить в серии статей и скринкастов.

Скринкаст к данной статье:

Если бы это был коммерческий проект, мы бы оценили его, помимо всего прочего, со стороны возможных рисков. В проекте есть часть, по которой нет ни знаний, ни опыта -- это написание Erlang сервера и общение с ним флэш клиента. А раз нет ни знаний, ни опыта, то эта часть самая рискованная. А раз она сама рискованная, то с нее и нужно начинать работу :)

Почему Erlang?

В коммерческом проекте мы бы выбирали технологию под требования проекта. В домашнем проекте можно поступать наоборот. И можно даже полностью проект придумать под технологию. Что я и сделал в данном случае :)

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

Erlang сервер

Разумеется, для знакомства с Erlang нужно прочитать (хотя бы частично) одну из двух книг:

А еще весьма актуальна для данного проекта книга Erlang OTP in Action, где подробно описан OTP фреймворк, стандартный для Erlang проектов. В этой книге, в 11-й главе есть практически готовый вариант TCP сервер, который нужно лишь чутка адаптировать к флэш клиенту. А именно -- реагировать на его security policy request и сериализовать/десериализовать AMF данные.

Там предлагается TCP сервер в виде стандартного OTP приложения, с супервайзером, с gen_server behaviour и прочими такого рода штуками. Он умеет принимать соединения, получать и отправлять бинарные данные. Разумеется, он может обслуживать несколько клиентов одновременно, запуская для каждого из них отдельный поток. Что не проблема для Erlang (а для Java, например, было бы проблемой).

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

Privacy policy request

Разработчики флэш плеера решили осложнить мне, разработчику под флэш плеер, жизнь. И для этого придумали модель безопасности. Это модель подразумевает, что я, разработчик под флэш плеер, являюсь злобным созданием, и из всех сил стремлюсь навредить пользователю. В принципе подход правильный :) [...]

TowerDefence #7. Движение врагов

TowerDefence #7. Движение врагов:

В прошлых уроках мы подготовили все самое необходимое, чтобы наконец перейти к полноценной разработке игры. Сегодня мы реализуем полноценное движение врагов и доработаем редактор уровней, а так же добавим пару полезных математических классов в наш проект [...]

четверг, 10 марта 2011 г.

Отчет о конференции BAFPUG New Wave

Отчет о конференции BAFPUG New Wave:

Tags:

Итак, 11-я конференция Belarus Adobe Flash Platform User Group состоялась и была успешной. Мы собрали около 50 человек, прочитали 5 докладов, вместо запланированных 4-х и записали видео.

Видео я пока выложил в торренты, на rutracker.org. Но я понимаю, что это не всем удобно. Поэтому видео также будет выложено на video.com. Но не сразу, это займет некоторое время.

Первым выступил Сергей Гончар aka Flastar. С недавних пор Сергей работает в компании Alternativa 3D, и он рассказывал о новых возможностях одноименного 3D движка.

На видео демки движка плохо видны, и их лушче смотреть в оригинале :)

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

Сергей Степуро рассказал про Parsley Application Framework и поделился опытом использования этого фреймворка.

Юра Жлоба aka yzh44yzh (то есть я), рассказал про технологии использования видео в интернете. Я постарался дать каркас знаний по этой обширной теме, позволяющий в ней ориентироваться.

И завершал конференцию Владимир Кривошеев aka Develar рассказом про использование Maven и Flexmojos в флекс проектах. Кроме того, Владимир немного рассказал о проекте, который он делает в JetBrains -- UI Designer для флекс проектов в Intellij IDEA, аналог Design View во Flash Builder.

[...]

суббота, 5 марта 2011 г.

Обучающий семинар от MotoCMS в Одессе

Обучающий семинар от MotoCMS в Одессе: "

Дорогие друзья! Если вы менеджеры веб-студий, создающие флэш-сайты - просим вас внимательно прочесть информацию ниже. Если вы не менеджер - позовите менеджера, ему эта информация будет полезнее.

Рады Вам сообщить, что разработчик программного обеспечения для управления сайтами - «MotoCMS» проводит обучающий бесплатный закрытый семинар в Одессе.

Время проведения: 11 марта, начало в 11.00

В программе семинара по MotoCMS:

  1. Первая секция: «Создаем сайт с MotoCMS»
  2. Определение понятий. Основы работы с Панелью управления. Работа с шаблонами. Работа со слотами и модулями. Возможности редактирования.
  3. Вторая секция: «Продаем сайт с MotoCMS»
  4. Преимущества продукта. Участие в закрытой аффилиатской программе. Выпуск продуктов на базе MotoCMS под брендом агентства. Модели продаж. Преимущества при работе с клиентами.

 
Отдельное внимание будет уделено вопросам монетизации и удобству продажи сайтов, созданных на базе Moto CMS. Приглашаем представителей Одесских веб-студий, флешеров и фрилансеров-одиночек к участию в семинаре.
 
Важно: Для участия в мероприятии (подготовка комплекта раздаточных материалов) необходима предварительная регистрация (ФИО, студия, контактный телефон).
 
По результатам семинара участникам будут выданы сертификаты, подтверждающие прохождение обучения.
 
Участие в семинаре БЕСПЛАТНОЕ [...]