среда, 26 декабря 2007 г.

Преобразование цветного изображения в чернобелое с использованием ColorMatrixFilter. AS3

Один из способов преобразования цветного изображения в оттенки серого - установить пропорции цветов R:G:B в отношении 3:6:1 соответственно.

BMP - имя класса изображения в библиотеке.

var bmp:BitmapData = new BitmapData(1600, 1200);
var b:Bitmap = new Bitmap(bmp);
this.addChild(b);
var arr:Array = [
0.3, 0.6, 0.1, 0.0, 0.0,
0.3, 0.6, 0.1, 0.0, 0.0,
0.3, 0.6, 0.1, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0
];
var cmf:ColorMatrixFilter = new ColorMatrixFilter(arr);
bmp.applyFilter(new BMP(1600, 1200), new Rectangle(0, 0, bmp.width,
bmp.height), new Point(0, 0), cmf);

воскресенье, 25 ноября 2007 г.

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

//this.__display - клип, в который только что было загружено растровое изображение

public function makeBitmap() {

//Сохраняем изображение в BitmapData с включенным сглаживанием
var bmp_data:BitmapData = new BitmapData(this.__display._width,this.__display._height,true,0);
bmp_data.draw(this.__display,new Matrix(),new ColorTransform(),"normal",new Rectangle(0,0,this.__display._width,this.__display._height),true);

//Очищаем клип от загруженных данных (возможно есть более правильный способ)
var display_parent:MovieClip=this.__display._parent;
var display_name:String=this.__display._name;
var display_depth:Number=this.__display.getDepth();
this.__display.removeMovieClip();
this.__display=display_parent.createEmptyMovieClip(display_name,display_depth);

//Выводим растр в очищенный клип
this.__display.attachBitmap(bmp_data,0,"auto", true);
}

суббота, 24 ноября 2007 г.

Ждем следующего фрейма для получения полноценного доступа к свойствам загруженного клипа. AS2

Особенность использования onLoadComplete вместо onLoadInit

private function waitForOneFrame() {
this.__display.onEnterFrame=Delegate.create(this,this.afterOneFrame);
}

private function afterOneFrame() {
this.__display.onEnterFrame=null;
//Есть доступ ко всем свойствам
}

private function onLoadComplete() {
this.waitForOneFrame();
}

пятница, 23 ноября 2007 г.

Вращение клипа относительно любой точки

var angle=0.1;
var vector_x=mc._x-pointx; var vector_y=mc._y-pointy;

mc.onEnterFrame=function(){
var cos=Math.cos(angle);
var sin=Math.sin(angle);
var vector_rotate_x=vector_x*cos-vector_y*sin;
var vector_rotate_y=vector_x*sin+vector_y*cos;
vector_x=vector_rotate_x;
vector_y=vector_rotate_y;
mc._x=vector_rotate_x+pointx;
mc._y=vector_rotate_y+pointy;
mc._rotation+=angle*180/Math.PI;
}

Вариант реализации паттерна Singleton с проверкой булева флага на возможность инстанцирования. AS3

package
{
/**
* Пример реализации паттерна Одиночка на языке ActionScript 3
* с проверкой специального флага на возможность инстанцирования.
*
* @author Yuri "Barmaley" Yarovoy
* @version 1.0
*/
public class Singleton
{
private static var __instance:Singleton;
private static var __allowInstantiation:Boolean = false;

public static function get instance():Singleton
{
if(!__instance)
{
// Разрешаем создание экземпляра класса.
__allowInstantiation = true;
// Создаем экземпляр.
__instance = new Singleton();
// Запрещаем создание экземпляров.
__allowInstantiation = false;
}
return __instance;
}
/**
* Конструктор.
*/
public function Singleton()
{
if(!__allowInstantiation)
throw new Error("Вы не можете создавать экземпляры класса при помощи конструктора. Для доступа к экземпляру используйте Singleton.instance.");
}
}
}

пятница, 16 ноября 2007 г.

Скрипт мониторинга загрузки

/*
* Скрипт мониторинга загрузки.
* Вставляется в главную временную шкалу, требует от владельца:
* - метод onComplete - что делать по завершении загрузки
* - String text_format - как форматировать текст информацией о загрузке. Сивол $ заменяется на процент загрузки
* - MovieClip display - клип, отображающий загрузку. Должен иметь 101 фрейм с анимацией мониторинга загрузки и текстовое поле text
*/

if (_root.getBytesLoaded()!=_root.getBytesTotal()) {
this.stop();
this.display.owner=this;
this.display.skipped=Number(_root.getBytesLoaded());
this.display.total=Number(_root.getBytesTotal()-this.display.skipped);
this.display.onEnterFrame=function (){
var progress:Number=Math.floor(((_root.getBytesLoaded()-this.skipped)*100)/this.total);
this.gotoAndStop(progress+1);
this.text.text=this.owner.text_format.split("$").join(progress);
if (_root.getBytesLoaded()==_root.getBytesTotal()) {
this.onEnterFrame=null;
this.owner.onComplete();
}
}
} else {
this.onComplete();
}

понедельник, 5 ноября 2007 г.

Принудительный вызов сборщика мусора. AS3

try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}


Позаимствовано отсюда.

четверг, 1 ноября 2007 г.

Как загрузить библиотеку и затем аттачить из нее клипы. AS3

package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
//
public class duplicateLoadedExample extends Sprite {
public function duplicateLoadedExample() {
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest( “library.swf” );
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, movieLoaded);
loader.load( url );
}
public function movieLoaded(event:Event){
var ms:Class = event.target.applicationDomain.getDefinition(”movie”) as Class;
var mvs = new ms();
addChild( mvs );
}
}
}

Версия подгружаемой SWF (Получить 4й байт)

static public const SWF_SIGN:String = 'CWS';
static public const SWF_VERSION_POS:int = 3;
static public function getSWFVersion(b:ByteArray):uint {
if(BinLoader.isSWF(b)) {
var pos:uint = b.position;
b.position = BinLoader.SWF_VERSION_POS;
var ver:uint = b.readByte();
b.position = pos;
return ver;
} else return null;
}

среда, 26 сентября 2007 г.

Код для темы "Настройка нормального хелпа под FlashDevelop". AS2

Объяснение читать здесь.

В руте лежат:
кнопки go, back, forward, abort,
поле ввода addr_input,
клип ext_bounds (область для окна браузера).


import mx.utils.Delegate;

//Общие настройки
Stage.align="TL";
Stage.scaleMode="noScale";
this.addr_input.backgroundColor=0xEEEEEE;
this.addr_input.borderColor=0x999999;

this.sending_lc = new LocalConnection();
this.receiving_lc = new LocalConnection();



//Разбор командной строки
this.params_object=new Object();
for (var i:Number=1;i<10;i++) {
var params_item:Array=mdm.Application.getCMDParams(i).split("=");
this.params_object[params_item[0]]=params_item[1];
}

if (this.params_object.path==null) this.params_object.path="";

if (this.params_object.pckg!=null) this.params_object.pckg=this.params_object.pckg.split(".").join("\\")+"\\"; else this.params_object.pckg="";
if (this.params_object.clss!=null) this.params_object.clss+=".html";
else {
if (this.params_object.pckg!="") this.params_object.pckg+="class-list.html";
this.params_object.clss="";
}

if (this.params_object.item!=null) this.params_object.item="#"+this.params_object.item; else this.params_object.item="";
if (this.params_object.kind==null) this.params_object.kind="";
if (this.params_object.kind=="function") this.params_object.item+="()";

if (this.params_object.file==null) this.params_object.file=this.params_object.pckg+this.params_object.clss;
if (this.params_object.file=="") this.params_object.file="index.html";


//Инициализация
this.paths_xml=new XML();


this.paths_xml.onLoad=Delegate.create(this,
function(success:Boolean) {

//*****************


if (!success) {
this.addr_input.text="Configuration file not found";
return;
}

//Ищем первый подходящий путь
this.addr_string="";
if (this.params_object.path!="") {
this.addr_string=this.params_object.path+this.params_object.file;
} else {
var xml_node:XMLNode=this.paths_xml.firstChild;
while (xml_node.nodeName!="paths") xml_node=xml_node.nextSibling;
xml_node=xml_node.firstChild;
var found:Boolean=false;
var first_path:String="";
while (xml_node!=null) {
if (xml_node.nodeName=="path") {
var path_str:String=xml_node.firstChild.toString();
this.addr_string=path_str+this.params_object.file;
if (first_path=="") first_path=this.addr_string;
if (mdm.FileSystem.fileExists(this.addr_string)) {
found=true;
break;
}
}
xml_node=xml_node.nextSibling;
}
if (!found) this.addr_string="";
}
if (this.addr_string!="") this.addr_string+=this.params_object.item;

//проверка на предыдущий запуск программы
this.sending_lc.onStatus=Delegate.create(this,
function(infoObject:Object) {
switch (infoObject.level) {
case 'status' :
mdm.Application.exit();
break;
case 'error' :
this.receiving_lc.reloadContent=Delegate.create(this,
function(addr_string:String) {
this.myBrowser.goto(addr_string);
mdm.Application.bringToFront();
}
);
this.receiving_lc.connect("test_previous_copy");
mdm.Application.onAppExit=Delegate.create(this,
function(){ this.receiving_lc.close();
}
);
break;
}
}
);
this.sending_lc.send("test_previous_copy", "reloadContent", this.addr_string);


//Инициализация браузера
this.addr_input.text=this.addr_string;
this.myBrowser = new mdm.Browser(0, 0, 0, 0, this.addr_string, false)
this.myBrowser.onDocumentComplete=Delegate.create(this,
function() {
this.addr_input.text=this.myBrowser.url;
}
);


this.delta_x=Stage.width-this.ext_bounds._width;
this.delta_y=Stage.height-this.ext_bounds._height;
this.onResize = function (){
this.ext_bounds._width=Stage.width-this.delta_x;
this.ext_bounds._height=Stage.height-this.delta_y;
this.myBrowser.x=Math.round(this.ext_bounds._x);
this.myBrowser.y=Math.round(this.ext_bounds._y);
this.myBrowser.width=Math.round(this.ext_bounds._width);
this.myBrowser.height=Math.round(this.ext_bounds._height);
}
Stage.addListener(this);
this.onResize();



this.go.onRelease=Delegate.create(this,
function() {
this.myBrowser.goto(this.addr_input.text);
}
);

this.back.onRelease=Delegate.create(this,
function() {
this.myBrowser.back();
}
);

this.forward.onRelease=Delegate.create(this,
function() {
this.myBrowser.forward();
}
);

this.abort.onRelease=Delegate.create(this,
function() {
this.myBrowser.stop();
}
);

this.onKeyDown = function() {
if (Key.isDown(Key.ENTER)) {
this.myBrowser.goto(this.addr_input.text);
}
}
Key.addListener(this);





//*****************
}
);

this.paths_xml.load("configuration.xml");


Файл конфигурации:
<paths>
<path>D:\Documentation\Flex\langref\</path>
<path>D:\Documentation\APE\api\</path>
<path>D:\Documentation\Fisix\API\</path>
</paths>